|
3、擦除Flash 在对Flash进行烧写之前,需要将其擦除: Uboot>protect off all ;去掉Flash的扇区写保护 Uboot>erase all ;擦除Flash的所有扇区
4、 烧写uboot.bin到Flash 在Uboot提示符下键入命令: Uboot>tftp 20000000 ;将文件发送到系统的SDRAM中 发送完毕后,会看到实际上传的字节数,记住十六进制表示的那个,键入以下命令: Uboot>cp.b 20000000 10000000 xxxx ;将发送到SDRAM中的数据写入Flash xxxx为刚才的字节数
OK,我们的uboot已经烧写进NORFLASH了,把板的电源拔掉,把跳线J100的1-2短接(选择片外储存器启动),我们的uboot应该可以正常启动了。
接下来便是在开发主机上(PC机)完成内核的编译: 首先当然是下载内核啦,把内核的tar包解压后,打上相应的补丁,然后执行 make at91rm9200dk_defconfig make menuconfig进行内核配置,内核的配置应按照实际的需要进行选择,其中为了调试的方便我们让内核支持NFS文件系统、NFSROOT和BOOTP或DHCP。 配置完后,保存退出,执行make,等内核编译成功后,把内核源码下的vmlinuz文件copy到uboot输出的目录,即$BUILD_DIR处,然后执行 arm-linux-objcopy -O binary vmlinuz linux.bin 把vmlinuz由ELF格式,转换为二进制格式的linux.bin gzip -9 linux.bin 压缩linux内核节省空间,生成linux.bin.gz文件 ./tools/mkimage -A arm -O linux -T kernel -C gzip -a 20008000 -e 20008000 \ -n 'Linux-Kernel' -d linux.bin.gz uImage 执行mkimage命令生成uboot能自动加载的镜像文件uImage 我们的linux内核便完成了,把uImage copy到tftpboot目录下(tftpboot是TFTP服务的根目录)
接下来便是制作根文件系统: 由于我们先前安装的Embedded Linux Development Kit 工具包内已集成了一个专为ARM用的根文件系统,所以只需稍作修改即可 1、 打开PC机上的TFTP服务,TFTP服务由xinetd服务控制;6s8Linux联盟 2、 打开PC机上的DHCP服务,其中6s8Linux联盟 option root-path "/xxx/xxx"; <--此处为NFS的输出目录 6s8Linux联盟 : filename "/tftpboot/uImage"; 6s8Linux联盟 打开此服务时得小心,确保在与THIZ内网断开得情况下进行,要不然MIS部找你算帐,可不关我的事啊^_^!!!!6s8Linux联盟 3、 打开PC机上的NFS服务把开发工具目录下的arm目录作为NFS的输出目录;6s8Linux联盟 4、 把PC机上/dev下的设备文件copy到开发工具目录下的arm目录中的dev目录里6s8Linux联盟 cp –aP /dev /* xxx/arm/dev/6s8Linux联盟 5、在xxx/arm/etc目录中执行 6s8Linux联盟 touch mtab6s8Linux联盟 把inittab中的默认运行级别改为1,由于板上的资源少,所以什么服务都不要开6s8Linux联盟 cat fstab << EOF6s8Linux联盟 none /proc proc defaults 0 06s8Linux联盟 none /proc/bus/usb usbfs defaults 0 06s8Linux联盟 EOF6s8Linux联盟 好了,至此根文件系统也完成了,那就联合调试吧
打开minicom,把H9200M板上跳线J100的1-2短接后,插上电源,看到uboot倒数时按任意键进入命令交换模式,首先得修改某些环境变量 printenv会看到uboot的默认环境变量,大部分都很熟悉,都是我们在include/configs/h9200m.h中定义的 setenv bootargs root=/dev/nfs ip=192.168.0.139 console=/dev/ttyS0,115200 mem=32M rw setenv bootcmd bootp 21000000\;run boot saveenv
RESET目标板,会看到uboot倒数完后便开始从PC机上下载uImage,然后解压linux内核,最后linux内核就运行起来 了,内核运行到挂载根文件系统时,便会发现要挂载的是NFS根文件系统(通过uboot的bootargs变量中的root=/dev/nfs告诉内核 的),于是发出广播,DHCP响应后便传给内核有关的信息,于是内核便知道NFS根文件系统在哪,从而挂载它,一切正常后,我们熟悉的linux命令行就 出现了,OK,大功告成,我们基于H9200M板的Linux操作系统的移植便完毕了。
Linux操作系统是运行起来了,但它什么也没干,岂不太便宜它了,不行,得找些活让它干,做什么好呢?就要它编译一些它自己要运行的应 用软件吧!编译一个Bittorrent的服务端和客户端,Bittorrent服务端需要Python来解析,所以得先编译Python,解压 Python后,执行 ./configure --prefix=/usr –share-library && make && make install经过漫长的等待后,Python便编译且安装完成,执行bittorrent的服务,可以上传文件,BT服务器一切正常;再编译 ctorrent客户端,执行./configure && make ,执行ctorrent文件,能正常下载文件,BT客户端也一切正常。
所有实验都完成了,我们还可以做一个小型的根文件系统,并进一步裁减linux内核,最后把内核和根文件系统都烧写进FLASH,做到这 一步时,你会发现等待uboot烧写大(说大其实也不大,就两三兆的东西)文件是一件多么痛苦的事情啊!!(深刻体会啊!!),你若是一个完美的追求者, 可尝试修改uboot源码下board/h9200m/flash.c的 int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)多字烧写函数,原来的函数是不断地调用write_word (info, wp, data)单字写函数,直到全部烧写完毕为止,但是通过查阅29LV320BE芯片手册,该芯片有快速写功能(Fast Program),快速写模式流程如下:
修改的程序如下:
6s8Linux联盟 int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt){ ulong wp, data, result; int rc; int cflag, iflag; int chip1;/* 检查需要写的目标地址是否字对齐,即地址的bit0必须为0*/ if (addr & 1) { printf ("unaligned destination not supported\n"); return ERR_ALIGN; };/* 同理,检查源地址是否字对齐 */ if ((int) src & 1) { printf ("unaligned source not supported\n"); return ERR_ALIGN; };/*Check if Flash is (sufficiently) erased*/ result = *(volatile u16 *)addr; // return 0xFFFF data = *(volatile u16 *)src; if ((result & data) != data) return ERR_NOT_ERASED; wp = addr; // destination address rc = ERR_OK; // initial rc = ERR_OK if (cnt == 1) goto OneByte;/* * Disable interrupts which might cause a timeout * here. Remember that our exception vectors are * at address 0 in the flash, and we don't want a * (ticker) exception to happen while the flash * chip is in programming mode. */ cflag = icache_status(); icache_disable(); iflag = disable_interrupts(); /* Set to Fast Mode */ MEM_FLASH_ADDR1 = 0xAA; MEM_FLASH_ADDR2 = 0x55; MEM_FLASH_ADDR1 = 0x20; /* Fast Program Mode */ while (cnt >= 2) { data = *((volatile u16 *) src); // get data from source MEM_FLASH_ADDR1 = 0xA0; // command *(volatile u16 *)wp = (volatile u16)data; // program /* arm simple, non interrupt dependent timer */ reset_timer_masked (); /*wait until flash is ready */ chip1 = 0; do { result = *(volatile u16 *)wp; /* check timeout */ if (get_timer_masked () > CFG_FLASH_ERASE_TOUT) { chip1 = ERR | TMO; goto Quit; } if (!chip1 && ((result & 0x80) == (data & 0x80))) // if word finished quit while chip1 = READY; } while (!chip1); /* verify data */ if (*(volatile u16 *)wp != data) { chip1 = ERR; goto Quit; } /* adjust src dst cnt */ src += 2; wp += 2; cnt -= 2; }Quit: MEM_FLASH_ADDR1 = 0x90; // reset fast mode MEM_FLASH_ADDR1 = 0xF0; if (chip1 == ERR) rc = ERR_PROG_ERROR; if (iflag) enable_interrupts (); if (cflag) icache_enable ();OneByte: if (cnt == 0) // return if all finished return rc; else { data = (*((volatile u8 *) src)) | (*((volatile u8 *) (wp + 1)) << 8); if ((rc = write_word (info, wp, data)) != 0) { return (rc); } src += 1; wp += 1; cnt -= 1; } return rc;}
共4页: 上一页 [1] [2] 3 [4] 下一页
|