omap

OMAP3530(Devkit8000)开发移植PSP(引用) 先给出TI官方指导: http://wiki.davinciDSP.com/index.php?title=OMAP35x_DVEVM_Getting_Started_Guide 下载位置: http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/dvsdk/DVSDK_3_00/latest/index_FDS.html 下面是网上另人的总结 前言今天下载了omap3530 EVM的PSP支持包,才知道到底是大公司出的板子!支持都这么全,怎么原来都不知道呢?!这个PSP里面包含使用文档、host-tools(里面有linux的工具和windows的工具)、image、scripts(主要用于设置环境变量)、src(xloader、uboot、kernel)等等,那是相当的全啊! 公司买的devkit开发板,确实很便宜,但光盘资料真是不多啊,好多都成为demo,DSS驱动的源码不给。郁闷了好久,这几天天天都是在网上网络omap的资料,现在资料找了很多了,但是却看不过来了。 其实我主要就是想要TI发布的DSS2驱动,但是怎么也找不到补丁,知道一个网站有,但是却不会下载!只好把整个EVM的PSP下载下来了。相对于我想吃自己做的炒白菜却不知道哪里有锅,最后自己搞了个厨房过来! 主要是英语不好啊,不愿意看英语文档。这个是TI最新发布的DVSDK,大家看看吧。下载地址: http://software-dl.ti.com/dsps/d ... test/index_FDS.html 准备工作 1.首先自然是下载OMAP35x-PSP-SDK-setuplinux-02.01.02.09.bin。然后是安装,这很简单,修改psp.bin的执行权限后,直接运行,完全的图形界面,感觉相当不错!(TI user Gide里说的是tar -zxvf,好像不对) 2.下载并安装交叉编译编译器Sourcery G++ Lite 2009q1-126 for ARM GNU/Linux ,也是图行界面安装。下载地址:http://www.codesourcery.com/sgpp/lite/arm/portal/release324 3.PSP的安装目录OMAP35x-SDK-MM.mm.pp.bb/src/kernel/ linux-MM.mm.pp.bb.tar.gz,解压后可得到内核源码。 4.现在我们可以通过命令来编译内核了,试试: make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH="arm" omap3_evm_defconfig 如果不出意外的话,运行时没问题的!但是,是不是有些麻烦呢? 我们修改内核根目录下MAKEFILE对应环境变量的如下两行: CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm 然后可以这样编译: make omap3_evm_defconfig 5.一般安装完编译器后不可以直接make uImage,生成uImage需要mkimage工具,而这个工具是uboot编译的时生成的。所以要生成uboot可以引导的内核首先要先编译一下uboot,然后可以在uboot/tool目录下找到mkimage可执行程序。拷贝mkimage到当前用户运行可以找到的目录下面即可。我一般拷贝到交叉编译器的bin目录下。 6.,我搜索了devkit8000开发板自带源码的内核下所有devkit相关的文件,并且添加到当前内核对应目录下。 board-omap3devkit8000.c //目录:linux-2.6/arch/arm/mach-omap2/ 作用:开发板程序 devkit8000.h //目录:linux-2.6/include/config/mach/omap3/ 作用:开发板头文件 lcd_omap3devkit8000.c //目录:linux-2.6/drivers/video/omap/ 作用:LCD驱动程序 omap3devkit8000.c //目录:linux-2.6/sound/soc/omap/ 作用:未知 omap3_devkit8000_defconfig //目录:linux-2.6/arch/arm/config/ 作用:开发板配置文件 出现问题: OK,现在可以开始我们的内核编译之旅了!但是前进的道路上从来都不是一帆风顺的,我们要乘风破浪才能到达胜利的彼岸!出发! 编译器问题执行: make clean make omap3_devkit8000_defconfig make uImage 在新的kernel 2.6.29 上编译不能通过,终端提示: arm-none-linux-gnueabi-ld: no machine record defined 解决方法放狗搜后,按照如下方法可以解决。将arch/arm/kernel/vmlinux.lds的最后两行(如下),给注释起来,但都没说是为了什么 ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") 自己到arch/arm/kernel/vmlinux.lds里看的时候,才发现那两行的上头写着 /* These must never be empty If you have to comment these two assert statements out, your binutils is too old (for other reasons as well) */ ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") 我想可能不是我交叉编译器太旧的缘故,而是太新了! 我用的是:Sourcery G++ Lite 2009q1-126 for ARM GNU/Linux 而官方是:Sourcery G++ Lite 2008q1-126 for ARM GNU/Linux 机器ID错误:现在注释后可以正常编译内核了!替换新的内核文件,在boot后提示: uncompressing linux ................................................. 然后再没有动静了,我想可能解压后给kernel传递参数时出现问题了吧。但是是什么参数可能出的问题就不晓得啦。 在这里困住了好久!因为这句话啥都没提示!好歹有句话啊。。。。。。。。 经过多方搜索,发现了一个调试技巧,嘿嘿嘿,一般人我不告诉他!那就是下面解决方法中提到的设置Kernel debugging,设置后,再重启启动内核就会出现详细的问题说明。 因为内核启动时首先进入SVC模式,关闭中断,并machine ID,如果uboot传输过来的 machine ID跟编译的内核machine ID不一致,那就就咯屁了。具体表现为:啥反应都没有! 解决方法: 1)。执行make xconfig 在配置中进入Kernel hacking,打开Kernel debugging和Kernel low-level debugging functions. 选中这两项的目的是打印出调试信息,重新make uImage Starting kernel ... Uncompressing Linux........................................................................................... done, booting the kernel. Error: unrecognized/unsupported machine ID (r1 = 0x000007d1). Available machine support: ID (hex) NAME 罓?0009 Please check your kernel config and/or bootloader. 终于看到阻在这里的原因啦,是机器ID错误,别人的机器ID错误至少有个NAME值啊,我的咋为空呢? 2) 是不是没有注册机器ID?猜测。这一步保证系统支持的ID里面含有devkit8000! make xconfig 发现system type菜单下面没有devkit的选项,肯定是哪里的配置文件还没有添加,经过分析,找到了/kernel/arch/arm/mach-omap2/Kconfig文件,在末尾配置添加了devkit8000支持。 config MACH_OMAP3_BEAGLE bool "OMAP3 BEAGLE board" depends on ARCH_OMAP3 && ARCH_OMAP34XX config MACH_OMAP3_DEVKIT8000 bool "OMAP3 DEVKIT8000 board" depends on ARCH_OMAP3 && ARCH_OMAP34XX 然后make xconfig 发现system type菜单,选择devkit选项,选devkit8000,保存。 3)上一步仅仅能保证可以支持,要想能正确支持,还要修改下面的文件。 1. 我们进到arch/arm/mach-omap2/board_devkit8000.c,在最后一段有这句 MACHINE_START(OMAP3_DEVKIT8000 , ”OMAP3 beggle board”) 这里OMAP3_DEVKIT8000就是machine ID的代号~ 呢具体值是多少呢?~ 2. 在文件arch/arm/tools/mach-types中最后一行添加,设置我们的machine ID是2001。 omap3_devkit8000 ARCH_OMAP3_DEVKIT8000 OMAP3_DEVKIT8000 2001 通过修改Kconfig和mach-types两个文件,我们可以使系统正确的识别我们的machine ID,并且从上面我们也可以看到r1= 0x000007d1,0x7d1就是2001。与我们所设置的machine ID是相一致的。 init_common_hw错误:继续前进,make uImage ,这时出错了,终端提示: arch/arm/mach-omap2/board-omap3devkit8000.c: In function 'omap3_devkit8000_init_irq': arch/arm/mach-omap2/board-omap3devkit8000.c:330: error: too few arguments to function 'omap2_init_common_hw' make[1]: *** [arch/arm/mach-omap2/board-omap3devkit8000.o] 离开 1 make: *** [arch/arm/mach-omap2] 离开 2 由错误提示我们可以看到:board-omap3devkit8000.c的第330行的omap3_devkit8000_init_irq函数使用了太少的参数,以至于编译不能通过。在linux 2.6.29 rc3 中,omap3_devkit8000_init_irq共有四个参数。调用方式为: omap2_init_common_hw(mt46h32m32lf6_sdrc_params, omap3_mpu_rate_table, omap3_dsp_rate_table, omap3_l3_rate_table); 而我们的board-omap3devkit8000.c中调用方式为: static void __init omap3_devkit8000_init_irq(void) { omap2_init_common_hw(mt46h32m32lf6_sdrc_params); omap_init_irq(); omap_gpio_init(); omap_dm9000_init(); ads7846_dev_init(); } 修改为: static void __init omap3_evm_init_irq(void) { omap2_init_common_hw(mt46h32m32lf6_sdrc_params, omap3_mpu_rate_table, omap3_dsp_rate_table, omap3_l3_rate_table); omap_init_irq(); omap_gpio_init(); omap3evm_init_smc911x(); } 另外,函数中的三个参数omap3_mpu_rate_table,omap3_dsp_rate_table, omap3_l3_rate_table定义在头文件omap3-opp.h中,所以还需在头文件中添加: #include "omap3-opp.h" LCD驱动错误:重新编译,make uImage 谢天谢地!编译竟然通过了,那我们已经成功一半了! 但是西贡屏幕显示是错误的,具体表现为花屏!不是花瓶哦! 显示器整个都花屏,lcd是左边半个屏幕乱闪。 解决方法 1. 在/drivers/video/omap目录下面,修改Makefile文件,将我们的lcd的源码编译进去。添加: objs-y$(CONFIG_MACH_OMAP_OMAP3_DEVKIT8000)+=lcd_omap3devkit8000.o 2. 将原来的omapfb_main.c替换新源码中的omapfb_main.c。因为天漠公司修改了此文件,并且在uboot的传输参数中跟此文件相关,要是用新的omapfb_main.c修改会比较多。 重新编译,拷贝内核到SD卡,重新启动,终于看到可爱的小企鹅啦! 网卡驱动错误: 小企鹅虽然看到了,但是网络不正常,找不到网卡! 网卡问题比较诡异! 1. 我用原来的dm9000.c代替了新内核中的同名文件,启动提示:omapfb 中断错误! 于是我再把dm9000.c文件换了回来,重新编译,没想到自己好了!启动时可以看到: dm9000 Ethernet Driver, V1.31 dm9000 dm9000: eth%d: Invalid ethernet MAC address. Please set using ifconfig eth0 (dm9000): not using net_device_ops yet eth0: dm9000a at c88ae000,c88b2400 IRQ 185 MAC: 00:00:00:00:00:00 (chip) 2. 提示网卡的MAC地址是错误的,我们可以通过修改驱动有一个默认的MAC地址,这样每次编译完后就不用再设置一遍MAC地址了。 if (!is_valid_ether_addr(ndev->dev_addr)) { /* try reading from mac */ static unsigned char mac_addr[6] = {0x00,0x11,0x22,0x33,0x44,0x55};//embest mac_src = "chip"; for (i = 0; i < 6; i++) //ndev->dev_addr = ior(db, i+DM9000_PAR); //注释掉这句 ndev->dev_addr = mac_addr;//embest //添加这句 } 重新启动,一切OK! 总结 这次编译内核出新的问题倒是不算多,我解决问题的方式也没有高明支持,主要比较了新旧文件的异同,其实比较的文件大约有几十个,这些文件都是最重确定问出问题的地方。也阅读了不少的源码,感觉还是有比较大的进的.

你可能感兴趣的:(omap)