首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>Linux 嵌入式>文章内容
嵌入应用--9200M开发板实验文档
来源:http://www.unix5.com 作者:linux爱好者 发布时间:2008-05-07  

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] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·嵌入式Linux系统下图形库讲解及
·Qt/Embedded在嵌入式Linux中的应
·嵌入式Linux:uClinux操作系统移
·嵌入式系统 Boot Loader 技术内
·嵌入式 用户图形接口uC/GUI的简
·基于GTK+和X的GUI在嵌入式Linux
·嵌入式Linux系统下的MiniGUI研究
·Linux串口上网的简单实现 (图解)
·在Ubuntu上建立Arm Linux的开发
·嵌入式Linux操作系统启动信息完
·Linux 2.6 内核的嵌入式系统应用
·嵌入式Linux在Blackfin处理器上
  相关文章
·如何在虚拟机Linux系统下连接ARM
·BusyBox 精简嵌入式 Linux 系统
·嵌入式uClinux的内核结构和开发
·三种嵌入式操作系统的深入分析与
·嵌入式Linux平台的多协议路由器
·实时嵌入式系统的图形界面支持系
·Linux 2.6 内核的嵌入式系统应用
·Qt/Embedded在嵌入式Linux中的应
·一种嵌入式Linux平台的软硬件设
·嵌入式Linux系统的低功耗策略研
·嵌入式Linux移植实时设备驱动程
·文档分析__嵌入式Linux在网络处

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!