Linux-2.6.20内核移植到AT91RM9200-EK

来源:互联网 发布:mysql match 完全匹配 编辑:程序博客网 时间:2024/04/30 05:47
 

历时将近一个月 终于完整的将Linux-2.6.20内核移植到AT91RM9200-EK了 期间碰到了很多的问题 现在进行总结

(1)第一个卡住的问题竟然是U-boot中烧录内核和ramdisk的地方。我晕 原谅我是菜鸟 当我擦出Flash的时候 诸如“erase off 10020000 10120000”一直报错说“Error: end address not on sector boundary” 这个卡住了快一个星期 后来终于明白10120000不是一个Sector的末端 我晕啊 可以用flinfo命令查看是否某个地址是一个sector的末端地址 不是末端地址不能进行任何操作 U-Boot的操作都是对于一个sector而言的

(2)第二个问题卡在AT91的网卡驱动上面 内核本身竟然不支持KS8995MA网络芯片 启动后始终找不到eth0设备 没办法 只有自己该程序了 在at91ether_probe函数中添加对KS8995MA芯片的识别和安装 KS8995MA不支持网络中断 速率也是明显的 改动比较小 牵涉到at91ether_probe at91ether_setup update_linkspeed这几个函数

(3)网卡算是能够顺利识别了 但进去之后又发现网卡的MAC地址竟然默认是空白的 这个是网上找到的办法就是修改get_mac_address函数 添加如下一段 设置一个默认值

static char def_mac[] = {0x36, 0xB9, 0x04, 0x00, 0x24, 0x80};
 memcpy(dev->dev_addr, def_mac, 6);

 return;

(4)网卡通过了 可惜又发现不能ping任何其他机器 最后发现是2.6.20内核默认支持RMII网络芯片 我们现在是MII芯片 这个需要到board_ek.c这个文件中去修改默认设置 这个board_ek.c是2.4内核没有的文件 这个文件被证实是相当的重要

static struct at91_eth_data __initdata ek_eth_data = {
 .phy_irq_pin = AT91_PIN_PC4,
 .is_rmii = 1,
};

修改为

static struct at91_eth_data __initdata ek_eth_data = {
 .phy_irq_pin = AT91_PIN_PC4,
 .is_rmii = 0,
};

此时内核再启动就发现ping已经没有问题

(5)网卡没问题了 又发现执行reboot之后系统无法正常启动 后来查到原来是Flash芯片类型的问题 默认的是AMD的芯片 我们要改成Intel的芯片类型 make menuconfig之后 这个正常了

make menuconfig -> Device Drivers -> Memory Technology Device(MTD) Support -> RAM/ROM/Flash chip drivers -> Support for Intel/Sharp flash chips

 

(6)下一个头痛的问题就是MTD驱动了 2.6内核和2.4内核在这个方面改动不小 这个不仅要修改physmap.c 还得修改board_ek.c两个文件 具体的就引用一部分文字吧

直接修改arch/arm/mach-at91rm9200/board-dk.c里面和physmap相关的结构体就OK了,我用的内核是linux-2.6.20-rc1:

static struct mtd_partition __initdata dk_flash_partition[] = {
// {
// .name = "NAND Partition 1",
// .offset = 0,
// .size = MTDPART_SIZ_FULL,
// },

// By UFox
{
.name "Boot",
.offset 0,
.size 0x40000,
}, {
.name "Splash BMP",
.offset MTDPART_OFS_APPEND,
.size 0x40000,
}, {
.name "Kernel Image",
.offset MTDPART_OFS_APPEND,
.size 0x280000,
}, {
.name "App Config", // 128KB
.offset MTDPART_OFS_APPEND,
.size 0x20000,
}, {
.name "Root FS",
.offset MTDPART_OFS_APPEND,
.size MTDPART_SIZ_FULL,
},
};

static struct physmap_flash_data dk_flash_data = {
.width = 2,
.nr_parts = 5,
.parts = dk_flash_partition,
};

这个我没仔细研究过,但是看了platform_device dk_flash和platform_driver physmap_flash_driver后,我觉得内核的驱动框架会根据dk_flash里的.name = "physmap-flash"将它与physmap_flash_driver相关联,然后调用physmap_flash_driver里的physmap_flash_probe(struct platform_device *dev)函数将dk_flash注册到MTD。

个人感觉是在platform_device_register(&dk_flash);的dk_flash结构里面包含了dk_flash_data,而在physmap.c文件里的physmap_flash_probe()函数里有一句physmap_data = dev->dev.platform_data;也就是说将dk_flash_data结构赋值给physmap_data这个结构指针,而系统又用这个physmap_data去填充map_info结构和添加MTD分区。

所以你在arch/arm/mach-at91rm9200/board-dk.c文件中对dk_flash_data的修改是可以成功添加MTD分区。但是如果我分析的对的话,为什么我自己那样做就不能编译通过呢?搞的我郁闷晕到。还请知道的兄弟来说说。

(7)看过上述文字MTD部分终于算是搞定了 终于看到分区的影子了 可又有新问题 自动挂载在mtd0设备的目录fdisk竟然无法保存数据 断电就丢数据了 我晕 后来才发现我的ramdisk用的是jffs2文件系统挂载但我并没有在编译选项里面添加jffs2文件系统的支持 搞得内核不支持

重新make menuconfig之后一切搞定

基本上就碰到如上几个问题 谢天谢地 总算顺利 革命尚未成功 通知仍需努力

原创粉丝点击