开发板:DM3730
虚拟机:ubuntu 14.04
编译器:arm-none-linux-gnueabi
uboot:U-Boot 2010.06-00166-gbf92a97
开发板内核:Linux-2.6.37
文件系统:ext3
一般芯片的启动机制都在芯片手册上有讲解 比如我这款a8的dm3730的启动机制大致如下
romcode->x-load(MLO)->u-boot.bin->uImage->rootfs
u-boot我选择的是用uart的方式启动 因为usb启动的话需要usb是host并且满足一下的协议才能发送相应的image
uart启动uboot的协议如上
具体的ASCI ID
先是ROMCODE发送ASIC ID给host 然后host接受到后就发送Boot message 和size of image ,image
协议看似复杂 其实用工具就可以实现 我们可以使用两个tools就是peserial,ukermit
使用方法是 调好sys_boot[4:0]然后上电下载就好了
也可以自行去分析在pserial和ukermit里怎么实现传输文件的 在这里简单的分析下pserial协议下载
//pserial.c
int main(int argc, char **argv)
{
signed char ret = 0;
unsigned char buff[MAX_BUF];
/* 0xF0030002表示继续从uart或者usb启动 */
unsigned int download_command = 0xF0030002;
char *port = NULL;
char *second_file = NULL;
char *appname = argv[0];
int c;
int read_size = 0;
unsigned int asic_id = 0;
char verbose = 0;
/* Option validation */
opterr = 0;
/* 分析参数 给相关的变量赋值 */
while ((c = getopt(argc, argv, PORT_ARG ":" SEC_ARG ":" VERBOSE_ARG)) !=
-1)
switch (c) {
case VERBOSE_ARG_C:
verbose = 1;
break;
case PORT_ARG_C:
port = optarg;
break;
case SEC_ARG_C:
second_file = optarg;
break;
case '?':
if ((optopt == SEC_ARG_C) || (optopt == PORT_ARG_C)) {
APP_ERROR("Option -%c requires an argument.\n",
optopt)
} else if (isprint(optopt)) {
APP_ERROR("Unknown option `-%c'.\n", optopt)
} else {
APP_ERROR("Unknown option character `\\x%x'.\n",
optopt)
}
usage(appname);
return 1;
default:
abort();
}
if ((port == NULL) || (second_file == NULL)) {
APP_ERROR("Error: Not Enough Args\n")
usage(appname);
return -1;
}
/* 打开端口 也就是/dev/ttyUSB0等 */
/* Setup the port */
ret = s_open(port);
if (ret != SERIAL_OK) {
APP_ERROR("serial open failed\n")
return ret;
}
/* 根据uart需求来配置端口 这里设置115200 偶校验 等 */
ret = s_configure(115200