前言
今天下载了omap3530 EVM的PSP支持包,才知道到底是大公司出的板子!支持都这么全,怎么原来都不知道呢?!这个PSP里面包含使用文档、host-tools(里面有linux的工具和windows的工具)、image、scripts(主要用于设置环境变量)、src(xloader、uboot、kernel)等等,那是相当的全啊!
公司买的devkit开发板,确实很便宜,但光盘资料真是不多啊,好多都成为demo,DSS驱动的源码不给。郁闷了好久,这几天天天都是在网上网络omap的资料,现在资料找了很多了,但是却看不过来了。
其实我主要就是想要TI发布的DSS2驱动,但是怎么也找不到补丁,知道一个网站有,但是却不会下载!只好把整个EVM的PSP下载下来了。相对于我想吃自己做的炒白菜却不知道哪里有锅,最后自己搞了个厨房过来!
主要是英语不好啊,不愿意看英语文档。这个是TI最新发布的DVSDK,大家看看吧。下载地址:
准备工作
1.首先自然是下载OMAP35x-PSP-SDK-setuplinux-02.01.02.09.bin。然后是安装,这很简单,修改psp.bin的执行权限后,直接运行,完全的图形界面,感觉相当不错!
2.下载并安装交叉编译编译器Sourcery G++ Lite 2009q1-126 for ARM GNU/Linux ,也是图行界面安装。下载地址:
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!
总结
这次编译内核出新的问题倒是不算多,我解决问题的方式也没有高明支持,主要比较了新旧文件的异同,其实比较的文件大约有几十个,这些文件都是最重确定问出问题的地方。也阅读了不少的源码,感觉还是有比较大的进的。
阅读(2115) | 评论(0) | 转发(0) |