U-Boot移植串口xmodem协议
今天完成了U-Boot上串口xmodem协议,实现了通过xmodem协议的数据传输,现将笔记整理如下。
串口xmodem的移植比较简单,参考ymodem协议就行。
实验环境:Linux ubuntu 9.10(来自韦东山老师光盘自带虚拟机)
开发板:
Jz2440(ARM9 S3C2440
NAND K9F2G08
SDRAM K4S561632 * 2)
U-Boot: u-boot-1.1.6
烧写工具: OpenJtag
串口软件:SecureCRT
一、增加loadx命令
在cmd_load.c (路径:u-boot-1.1.6/common/cmd_load.c)中增加一条U_BOOT_CMD命令以支持xmodem。
找到loady命令的U_BOOT_CMD结构体,紧跟其后增加loadx的U_BOOT_CMD。
U_BOOT_CMD(
loady, 3, 0, do_load_serial_bin,
"loady- load binary file over serial line (ymodem mode)\n",
"[ off ] [ baud ]\n"" - load binary file over serial line"" with offset 'off' and baudrate 'baud'\n"
);
U_BOOT_CMD(
loadx, 3, 0,do_load_serial_bin,
"loadx- load binary file over serial line (xmodem mode)\n",
"[ off ] [ baud ]\n""- load binary file over serial line"" with offset 'off' and baudrate 'baud'\n"
);
红色为新增部分。
二、增加loadx命令处理分支
在文件cmd_load.c(路径:u-boot-1.1.6/common/cmd_load.c)中找到函数do_load_serial_bin(),新增加loadx的分支,修改后如下:
if (strcmp(argv[0],"loadx")==0) {
printf ("## Ready for binary (xmodem) download ""to 0x%08lX at %d bps...\n", offset,load_baudrate);
addr = load_serial_xmodem (offset);
} else if (strcmp(argv[0],"loady")==0) {
printf ("## Ready for binary (ymodem) download""to 0x%08lX at %d bps...\n",offset, load_baudrate);
addr = load_serial_ymodem (offset);
} else ……
红色部分为新加入loadx处理分支。
三、新增load_serial_xmodem()函数
在文件cmd_load.c(路径:u-boot-1.1.6/common/cmd_load.c)中仿照load_serial_ymodem()实现load_serial_xmodem()函数,没有什么技巧,主要修改以下两点:
1.局部数组ymodemBuf改为xmodemBuf;
2.info.mode的值由xyzModem_ymodem改为xyzModem_xmodem。代码太多,完成后的函数见附件cmd_load.c。
特别注意,需要在文件cmd_load.c(路径:u-boot-1.1.6/common/cmd_load.c)的开头增加函数load_serial_xmodem()的声明。
#if (CONFIG_COMMANDS & CFG_CMD_LOADB)
static ulong load_serial_ymodem (ulong offset);
static ulong load_serial_xmodem (ulong offset);
#endif
红色为新增。
xmodem协议移植完毕后,重新编译u-boot,然后烧写到开发板。
四、测试串口xmodem协议
为了测试移植是否成功,使用串口xmodem协议下载一个LED程序到SDRAM中运行(LED闪灯程序链接地址在0x30000000处,源码见附件)。
使用串口线连接好开发板与PC,打开SecureCRT,选择与开发板适应的波特率,开发板上电,进入u-boot界面,在u-boot命令行输入“?”或者“help”,可以看到loadx协议的命令提示。
imls - list all images found in flash
itest - return true/false on integer compare
loadb - load binary file over serial line (kermit mode)
loads - load S-Record file over serial line
loadx - load binary file over serial line (xmodem mode)
loady - load binary file over serial line (ymodem mode)
loop - infinite loop on address range
md - memory display
mm - memory modify (auto-incrementing)
mtest - simple RAM test
mw - memory write (fill)
在u-boot命令行输入loadx 0x30000000。
JZ2440 # loadx 0x30000000
## Ready for binary (xmodem) download to 0x30000000 at 115200 bps...
CCCCCCC
u-boot已经在等待数据了。
在SecureCRT菜单中选择“传输->发送Xmodem(N)”,如图1。
图1选择发送Xmodem
在弹出的对话框中选择leds.bin,开始数据传输。如图2。
图2选择发送bin文件
JZ2440 # loadx 0x30000000
## Ready for binary (xmodem) download to 0x30000000 at 115200 bps...
CCCCCCCCCC
开始 xmodem传输。 按 Ctrl+C 取消。
100%
168 bytes
168 bytes/s 00:00:01
0 Errors
xyzModem - CRC mode, 2(SOH)/0(STX)/0(CAN) packets, 10 retries
## Total Size
= 0x000000a8 = 168 Bytes
发送完毕,输入go命令执行程序。
JZ2440 #go 0x30000000
## Starting application at 0x30000000 ...
可以看到在Jz2440开发板上leds已经开始闪烁了。说明移植xmodem协议OK!
五、小结
串口的xmodem移植比较简单,也很容易看到效果,比较适合初学者。如果想仅仅测试xmodem移植效果,可以直接使用附件中的cmd_load.c文件替换掉源文件(路径:u-boot-1.1.6/common/cmd_load.c)即可。如果在传输数据时,串口上时间没有反应,请按 Ctrl+C 取消,然后重新再试一次基本就OK。
六、参考资料
《嵌入式Linux应用完全开发手册》-第15章 U-Boot分析与移植
七、附件
leds测试程序,链接地址0x30000000
- leds_0x30000000.rar ( 7.11 K, 下载次数:3)
移植好xmodem协议的cmd_load.c
- cmd_load.rar ( 7.37 K, 下载次数:1)
声明:本文为个人原创,边移植边写,完全来自实践。本文首先发表在百问网(www.100ask.net)转载请指明出处。
原文地址:http://www.100ask.net/forum/showtopic-3631.aspx
免费视频下载地址:
第1期共33个视频,免费,下载后可以直接观看,下载地址:
http://115.com/folder/fa55184z#
http://dl.dbank.com/c03o1ebwlo
第一期视频从Linux安装开始,讲解了SDRAM、NAND FLASH、LCD等硬件操作,U-Boot的移植、内核移植、简单字符驱动的编写,非常详尽。
第二期视频主要是驱动深入讲解,精华啊!
第二期视频需要收费的哦,具体见韦东山老师淘宝店铺:
书籍资料下载:
《嵌入式Linux应用开发完全手册》及相关资源电炉可以下载:
http://www.verycd.com/topics/2828590/
嵌入式linux应用开发完全手册光盘里的驱动和例子源代码.rar详情
嵌入式linux应用开发完全手册.pdf详情
如果能买一块韦东山老师的开发板,加上视频讲解,加上书,那学起来就太Easy了!
淘宝店铺上http://100ask.taobao.com/全套都有了!!!