Nor Flash移植:
在 u-boot 中 smdk2410 单板已经有了 Nor Flash 的驱动,代码位于 /board/samsung/smdk2410/flash.c ,但是这个文件实现的太粗糙,通用性不好,其实在 u-boot-2010.06 中已经支持 CFI 接口的 flash 驱动,相关代码位于 /drivers/mtd/cfi_flash.c 。但是很可惜,这个文件在我的 mini2440 上有问题,这里我找了一个可以用的驱动:cfi_flash.c 。移植的步骤就是把这个文件拷贝到单板目录下,修改 Makefile 文件,直接编译,此时肯定会出现很多“未定义的宏”错误,只要在配置文件里面把这些宏定义上就可以了。
函数调用关系:
start_armboot @ arch/arm/lib/board.c
flash_init @ board/samsung/smdk2440/cfi_flash.c
对于比较旧的 mini2440 开发板,上面用的是已经停产的 SST39VF1601 Nor Flash,这里移植了一个简单的驱动供参考。
Nand Flash移植:
移植 Nand Flash 时首先要在配置文件中定义 CONFIG_CMD_NAND 这个宏,这样 /drivers/mtd/nand/nand.c 文件才会被编译到 u-boot 中。其实你完全可以从 arch/arm/lib/board.c 文件里面一路往下看,Nand Flash 的初始化是调用 board.c 中的 nand_init() 函数,看看调用这个函数需要哪些条件,然后在配置文件中定义即可。Nand Flash 的移植涉及到 NAND 控制器,2410 和 2440 的 NAND 控制器有所区别,所以这部分的代码需要我们自己编写。u-boot 里面 Nand Flash 的驱动来自内核,因此已经做了很好的分层,移植说白了就是实现几个底层的函数(比如:发命令函数,发地址函数,片选函数),供上一层调用。
在 Linux 内核中存在大量分层的设计思想,这种设计可以使编写驱动的人员工作量大大减少,它把那些共性的东西都为我们实现了,而把最小的差异(硬件相关)抽取出来给驱动工程师实现。比如对于 Nand Flash 驱动,核心层(上一层)知道发什么命令,因为这涉及到 NAND 协议;硬件层(下一层)知道怎么发,因为这涉及到具体寄存器的操作。
函数调用关系:
start_armboot @ arch/arm/lib/board.c
nand_init @ drivers/mtd/nand/nand.c
nand_init_chip @ drivers/mtd/nand/nand.c
board_nand_init @ board/samsung/smdk2440/s3c2440_nand.c
——忠于梦想 勇于实践 linux_xpj@opencores.org
阅读(1287) | 评论(0) | 转发(0) |