您的位置:首页 > 运维架构 > Shell

u-boot移植随笔:自定义u-boot命令点灯

2010-11-10 13:15 260 查看
u-boot移植随笔:自定义u-boot命令点灯

 

前几天一不小心在CSDN论坛上发帖散分,同时许诺完成点灯就结账,经过努力,终于可以在u-boot的shell中输入自定义的命令来点灯了。下面简单讲一下,但不想深入讲解原理。

 

网上很多教程都是在start.s中使用汇编来点灯,这种方法是可以的。但boss说这样不好,因为这是直接操作寄存器的。而网上很多资料都说要注释掉coloured_LED_init和red_LED_on这两个函数。而我偏偏想用这两个函数来实现点灯。——毕竟人家原来就有了的。在研究这个方法的同时,也了解了weak链接,学到一点东西,但自己实现起来,却又不可以!无论怎么捣鼓,那几个灯就是不按自己程序中写的那样点亮!后来实在没招了,只好使出绝招了。

 

那就是:自定义u-boot命令来点灯!同时学习一下如何添加自定义的命令。

 

u-boot中已经有了2440的GPIO结构体——s3c24x0_gpio,也有“宏函数”获取IO结构体的地址——s3c24x0_get_base_gpio(),一切只等我拿来使用了。本来想在common目录下建立一个cmd_led.c文件的,但这样可能不太好,后来就直接在smdk2440.c里面定义led函数,在定义s3c24x0_get_base_gpio函数的头文件所在的目录新建s3c2440.h头文件,声明led函数。这样虽然不太好,但目前只是作为测试,亦无妨了。

 

有了自定义的函数,再填充U_BOOT_CMD宏就可以了。这个宏有6个部分,分别是u-boot shell中的命令(就是我们敲的命令,如flinfo等等)、最大参数,重复次数(?)、命令实现函数、使用方法、帮助。命令实现函数形式为

int do_foo(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])

至于为什么这样,看U_BOOT_CMD就清楚了。

 

点灯程序参考了以前写的LED驱动程序,顺序测试没有任何问题,但测试多几次,却发现有严重的bug!比如让四个灯从1到4顺序点亮,没有问题,但先点4就出现问题了,灭灯同样也存在这样的问题,修改了很久,也没有解决,初步估计是移位造成的。——这些问题先留着,以后能解决就解决,万一哪一天我功力大增,一下子就解决了呢?

 

这里介绍一下移植u-boot的背景吧。

 

u-boot版本是2010.09,因为现在上官方ftp,最新稳定版本就是这个。开发板芯片是S3C2440,很早就买了,上面的NOR Flash原来是2MB的,现在换成了8MB(听说NOR flash很贵),封装是一样的。打算在上面移植u-boot、内核、根文件系统,NAND暂时不考虑。

换flash后,用H-JTAG也可以下载,但要修改配置文件,将其中的芯片型号修改为使用的那个,寄存器赋值可以参考2410的配置文件,下载工具和配置文件可以在H-JTAG官网论坛上找到。

这次移植,除了正常的移植之外,还打算深入研究一下u-boot的代码,以及这过程中涉及到的知识——比如研究.lds文件、生成的.map文件、内存分布、链接以及代码技巧及组织。。。。都对自己水平的提高有很大帮助。当作一个初出茅庐的人来说,不断学习是一件始终要坚持的事情。

 

昨天完成点灯、网络芯片程序修改,同时意识到版本控制的重要性,今天主要研究版本控制SVN的用法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息