Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308091
  • 博文数量: 60
  • 博客积分: 1451
  • 博客等级: 上尉
  • 技术积分: 710
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-23 23:55
文章分类

全部博文(60)

文章存档

2017年(9)

2014年(1)

2013年(1)

2011年(9)

2010年(35)

2009年(5)

我的朋友

分类: 嵌入式

2011-03-20 23:18:53

前言

今天下载了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) |
给主人留下些什么吧!~~