Chinaunix首页 | 论坛 | 博客
  • 博客访问: 112478
  • 博文数量: 49
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-23 17:29
文章分类
文章存档

2014年(39)

2013年(10)

我的朋友

分类: Delphi

2014-02-07 14:27:01

根据http://blog.sina.com.cn/s/blog_6ca3f0fe0100tz1l.html和韦东山的《嵌入式linux应用开发》移植
由于没有从nand flash 启动代码,所以需要参考JZ2440开发板的自制uboot中nand flash启动代码
关于网卡DM9000的驱动,同上参考JZ2440开发板的uboot的dm9000x.c代码,还要相应的修改lowlevel.S代码。
在操作nor flash 的时候不能使用擦除命令,修改flash.c中的下面的代码。将出现错误那条语句注释掉,跳过擦除flash超时语句。(不知其真正的修改理由)
    #if 0
    if ((now=get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
     printf("Flash erase timeout at address %lx\n", info->start[sect]);
     *addr = FLASH_CMD_SUSPEND_ERASE;
     *addr = FLASH_CMD_RESET;
     return 1;
    }
    #endif
 
下面是在移植过程中出现的错误及相关的解决方法(排版有些乱):
 
遗留的问题:
1.norflash 不能进行擦除操作(解决)
2.tftp服务器不能使用
3.没有进行分区(解决)
4.在uboot中不能使用save命令(解决)
5.在uboot中不支持yaffs2文件系统烧写(解决)
6.在串口终端中不能使用mtdparts命令查看分区(解决)
7.启动不了内核:Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)问题(解决)
8.自制的uboot烧写jz的内核和文件系统映像后,不能正常启动(解决)
相关操作:
set ipaddr 222.31.45.100
set serverip 222.31.45.201
set ethaddr 00:0C:29:D1:47:C4
set serverip 222.31.45.222
set ipaddr 222.31.45.100;set serverip 222.31.45.201;set ethaddr 00:0C:29:D1:47:C4

通过串口下载uboot
loady 30000000
protect off all
erase 0 7ffff  //uboot 512k
cp.b 30000000 0 80000  //复制到nor flash的0地址处,512k大小
reset
//protect off all;protect off all;cp.b 30000000 0 80000

通过串口下载uboot到nand flash
loady 30000000
nand erase 0 40000
nand write 30000000 0 40000
reset
可以利用nfs来下载:(tftp服务不能)
nfs 30000000 222.31.45.201:/home/hyx/nfs_root/fs_mini/u-boot.bin
nfs 30000000 222.31.45.201:/home/hyx/nfs_root/u-boot.bin
nfs 30000000 222.31.45.201:/home/hyx/u-boot.bin(失败)//解决修改虚拟机上hyx文件的属性chmod 777 hyx/
nfs 30000000 222.31.45.201:/home/hyx/u-boot-1.1.6/u-boot.bin
nfs 30000000 222.31.45.201:/home/hyx/uImage(这是下载的jz开发板是linux-2.6.22的内核)
tftp 30000000 u-boot.bin
QT 虚拟机上的vsftpd.conf文件配置信息:
/home/hyx/nfs_root/fs_mini      222.31.45.100(rw,sync)
/home/hyx                      222.31.45.100(rw,sync)
下载linux-2.22.6内核到开发板
nfs 33000000 222.31.45.201:/home/hyx/nfs_root/fs_mini/zImage
nfs 32000000 222.31.45.201:/home/hyx/nfs_root/fs_mini/zImage
nfs 32000000 222.31.45.201:/home/hyx/linux-2.6.22.6/arch/arm/boot/zImage
nfs 30000000 222.31.45.201:/home/hyx/linux-2.6.22.6/arch/arm/boot/zImage
注意:
下面启动内核命令:
1.对于下载的zImage内核来说,用go命令来启动内核
2.对于下载的uImage内核来说,用bootm命令来启动内核
机器码不对应问题:(方法1.未解决,方法2解决)
Error: unrecognized/unsupported machine ID (r1 = 0x33f3fca8).
Available machine support:
ID (hex)        NAME
000000c1        SMDK2410   //193
0000016a        SMDK2440   //362
1.解决(此方法不行,待分析):在linux-2.6.22内核用linux-2.6.22.6-fl2440\arch\arm\tools\mach-types的下:
210行   smdk2410  ARCH_SMDK2410  SMDK2410  193
1021行  smdk2440  MACH_SMDK2440  SMDK2440  1008
改为
210行   smdk2410  ARCH_SMDK2410  SMDK2410  193
1021行  smdk2440  MACH_SMDK2440  SMDK2440  362

在\linux-2.6.22.6-fl2440\arch\arm\kernel\head.S中
* See linux/arch/arm/tools/mach-types for the complete list of machine,能够查到mach-types文件被谁给包含
2.解决:在linux-2.6.22.6-fl2440\arch\arm\kernel\head.S中在
 .section ".text.head", "ax"
 .type stext, %function
ENTRY(stext)语句后添加如下语句,将machine ID写死
  /********* add here *********/
 mov    r0, #0
 ldr    r1, =0x16a
 ldr    r2, =0x30000100
 /********* end add *********/

6.在串口终端中不能使用mtdparts命令查看分区
由内核中的分区表去修改uboot中的分区信息。例如以下内核分区表:
Creating 4 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x00000000-0x00040000 : "bootloader"
0x00040000-0x00060000 : "params"
0x00060000-0x00260000 : "kernel"
0x00260000-0x10000000 : "root"
在配置文件中增加如下宏
#define CONFIG_JFFS2_CMDLINE 1  
#define CONFIG_JFFS2_NAND    1
#define MTDIDS_DEFAULT "nand0=nandflash0"
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:256k@0(bootloader)," \
                            "128k(params)," \
                            "2m(kernel)," \
                            "-(root)"
然后在main.c中的main_loop函数中的
#ifdef CONFIG_AUTO_COMPLETE
 install_auto_complete();
#endif
下添加如下语句;                           
/*  执行mtd分区,在此处添加mtdparts_init函数执行初始化 */
#ifdef CONFIG_JFFS2_CMDLINE
    extern int mtdparts_init(void);
    if (!getenv("mtdparts"))
    {
        run_command("mtdparts default", 0);
    }
    else
    {
        mtdparts_init();
    }
#endif
还有修改开发板的配置文件
原来的
#define CONFIG_COMMANDS \
   (CONFIG_CMD_DFL  | \
   CFG_CMD_CACHE  | \
   CFG_CMD_NAND  | \
   /*CFG_CMD_EEPROM |*/ \
   /*CFG_CMD_I2C  |*/ \
   /*CFG_CMD_USB  |*/ \
   CFG_CMD_PING  | \
   CFG_CMD_REGINFO  | \
   CFG_CMD_DATE  | \
   CFG_CMD_ELF)
更改后的
#define CONFIG_COMMANDS \
                        ((CONFIG_CMD_DFL | \
                        CFG_CMD_CACHE    | \
                 
                        CFG_CMD_PING     | \
                        CFG_CMD_JFFS2    | \
                        CFG_CMD_NAND     | \
                
                        /*CFG_CMD_EEPROM |*/ \
                        /*CFG_CMD_I2C    |*/ \
                        /*CFG_CMD_USB    |*/ \
                        CFG_CMD_REGINFO  | \
                        CFG_CMD_DATE     | \
                        CFG_CMD_ELF))
                       
此时以后烧写内核就可以用一下命令,擦除命令中用分区来代替地址
nfs 30000000 222.31.45.201:/home/hyx/uImage(这是下载的jz开发板是linux-2.6.22的内核)
nand erase kernel
nand write 30000000 kernel
烧写jffs2文件系统
nfs 30000000 222.31.45.201:/home/hyx/fs_mini_mdev.jffs2(这是下载的jz开发板是linux-2.6.22内核对应的jffs2文件映像)
nand erase root
nand write 30000000 0x00260000 文件大小(注:为下载后的文件大小)
向nand flash中写时出现了如下错误:
NAND write: device 0 offset 0x260000, size 0x5b89a8
nand_write_ecc: Attempt to write not page aligned data
 0 bytes written: ERROR
 解决:
nand write.jffs2 30000000 0x00260000 $(filesize)
然后设置启动参数:
//set bootargs noinitrd console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2
set bootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2
执行boot命令后出现如下错误:
## Starting application at 0x32000000 ...
undefined instruction
pc : [<32000008>]    lr : [<33f8a490>]
sp : 33f3f810  ip : ffffffff  fp : 33f3fa95
r10: 33f3f97b  r9 : fff30302  r8 : 33f3ffdc
r7 : 33f3fa95  r6 : 00000002  r5 : 33f3f930  r4 : 32000000
r3 : 00000002  r2 : 50000000  r1 : 33f3f930  r0 : ea000015
Flags: nZCv  IRQs off  FIQs off  Mode SVC_32
Resetting CPU ...
解决方法(暂无):
这个是要修改启动命令参数
bootcmd=nand read.jffs2 0x30000000 kernel; bootm 0x30000000(不能在uboot中设置bootcmd参数,因为有分好“;”。)
设置bootcmd命令的方法:
set 'bootcmd nand read 0x30000000 kernel; bootm 0x3000000'(加上点引号)
然后进入uboot后就可以倒计执行bootcmd命令启动内核了
或是用
nand read 30000000 kernel
bootm 30000000
然后又出现了如下错误:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
查看内核启动信息后得知:uboot没有成功地将cmdline传递给内核,其内核cmdline为
Kernel command line: root=/dev/hda1 ro init=/bin/bash console=ttySAC0
通过查看jz的uboot-1.1.6的配置文件发现是因为没有定义
#define CONFIG_SETUP_MEMORY_TAGS    1
#define CONFIG_CMDLINE_TAG          1
这两个宏,导致那些tag参数没有成功的传递给内核,具体的程序在armlinux.c中
然后再重新启动内核后就能看不到以上错误信息了。
烧写yaffs2文件系统
nfs 30000000 222.31.45.201:/home/hyx/fs_mini_mdev.yaffs2(这是下载的jz开发板是linux-2.6.22内核对应的yaffs2文件映像)
nand erase root
nand write.yaffs 30000000 0x00260000 $(filesize)
//--------------------------------------------

4.在uboot中不能使用save命令(解决方法)
通过查看saveenv命令可以追溯到env_nand.c文件中。看程序可知修改配置文件fl2440.h
增加如下宏
#define CFG_ENV_IS_IN_NAND  1         //根据env_nand.c文件程序要增加此宏
#define CFG_ENV_SIZE         0x20000  //环境参数的大小   其大小必须是整块的大小,128k的倍数 
#define CFG_ENV_OFFSET      0x40000 //boot参数存放nand flash中的位置
然后重新编译uboot,下载到nor flash中。
在串口可以看到*** Warning - bad CRC or NAND, using default environment信息
然后输入save命令后警告信息消失。这样就可以在nand flash上保存环境变量了
下载jffs文件系统到内核
nfs 30000000 222.31.45.201:/home/hyx/fs_mini.jffs2
阅读(1776) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~