完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 一只耳朵怪 于 2018-6-4 16:58 编辑
关于如何配置Linux NAND flash driver,大家可以参考http://processors.wiki.ti.com/index.php/AM335x_NAND_Driver's_Guide 对于一些接触Linux NAND flash driver的朋友,这里简要介绍一下。 Linux下,访问NAND,NOR等flash,是通过MTD(Memory Technology Device)子系统进行的。使用MTD的目的在于为各种memory,尤其是flash的访问提供一个通用的接口。 从上述框图,可以看出MTD框架下的NAND FLASH驱动主要分为 MTD设备层 MTD原始设备层 Flash 硬件驱动层 关于MTD具体的实现感兴趣的,可以在网上找更多的资料参考。 在这里,我们主要讨论在AM335X系统设计中,进行NAND FLASH设计时,驱动侧需要修改哪些地方。 从上述部分可以看出,与硬件底层相关的部分为flash硬件驱动层。 由于Linux NAND驱动的日益标准化,NAND的底层操作大抵相同,在使用不同NAND flash时,需要修改的部分比较简单。 以SDK06.00为例,只需要修改如下部分: (1)NAND pinmux配置:该部分进行NAND flash的管脚配置。如使用16-bit的NAND flash,需要在如下结构体中增加高8bit的管脚配置。 路径: linuxarchARMmach-omap2board-am335xevm.c /* Pin mux for nand flash module */ static struct pinmux_config nand_pin_mux[ ] (2) NAND 分区信息配置:该部分决定NAND FLASH的分区情况,大致会分为SPL,SPL_BACKUP, U-BOOT, KERNEL, FILESYSTEM, USER_DATA 路径: linuxarcharmmach-omap2board-am335xevm.c /* NAND partition information */ static struct mtd_partition am335x_nand_partitions[] (3) NAND 时序配置:针对不同的NAND flash型号,时序要求会有差异。AM335X通过GPMC与NAND连接,可通过配置GPMC的时序,达到正确快速地访问NAND flash中的数据。 路径: linuxarcharmmach-omap2board-am335xevm.c static struct gpmc_timings am335x_nand_timings 上述结构体统一在evm_nand_init()中调用: static void evm_nand_init(int evm_id, int profile) [ struct omap_nand_platform_data *pdata; struct gpmc_devices_info gpmc_device[2] = [ [ NULL, 0 ], [ NULL, 0 ], ]; setup_pin_mux(nand_pin_mux); pdata = omap_nand_init(am335x_nand_partitions, ARRAY_SIZE(am335x_nand_partitions), 0, 0, &am335x_nand_timings); if (!pdata) return; pdata->ecc_opt =OMAP_ECC_BCH8_CODE_HW; // 使用BCH8 ECC pdata->elm_used = true; gpmc_device[0].pdata = pdata; gpmc_device[0].flag = GPMC_DEVICE_NAND; omap_init_gpmc(gpmc_device, sizeof(gpmc_device)); omap_init_elm(); ] 而evm_nand_init最终通过一个板级配置的结构体进行调用,如 static struct evm_dev_cfg gen_purp_evm_dev_cfg[] = [ [am335x_rtc_init, DEV_ON_BASEBOARD, PROFILE_ALL], [clkout2_enable, DEV_ON_BASEBOARD, PROFILE_ALL], [enable_ecap0, DEV_ON_DGHTR_BRD, (PROFILE_0 | PROFILE_1 | PROFILE_2 | PROFILE_7) ], [lcdc_init, DEV_ON_DGHTR_BRD, (PROFILE_0 | PROFILE_1 | PROFILE_2 | PROFILE_7) ], [mfd_tscadc_init, DEV_ON_DGHTR_BRD, (PROFILE_0 | PROFILE_1 | PROFILE_2 | PROFILE_7) ], [rgmii1_init, DEV_ON_BASEBOARD, PROFILE_ALL], [rgmii2_init, DEV_ON_DGHTR_BRD, (PROFILE_1 | PROFILE_2 | PROFILE_4 | PROFILE_6) ], [u***0_init, DEV_ON_BASEBOARD, PROFILE_ALL], [u***1_init, DEV_ON_BASEBOARD, PROFILE_ALL], [evm_nand_init, DEV_ON_DGHTR_BRD, (PROFILE_ALL & ~PROFILE_2 & ~PROFILE_3)], ] Note: 由于TI GPEVM板上使用一个拨盘开关进行切换,来实现不同的profile下的管脚复用。 如设计是直接连接,其后写PROFILE_ALL即可。 参考文档: http://blog.csdn.net/eilianlau/article/details/6961406 |
|
相关推荐
1个回答
|
|
请问,有没有从am335x来分析nandflash的驱动的文档,我看编译后的mtd/nand 下边有一个nand.o的文件和一个omap.o的文件,请问nand.o的文件是哪里编译得来的,omap.c就是am335x的驱动代码吧?
|
|
|
|
只有小组成员才能发言,加入小组>>
334 浏览 1 评论
528 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
773 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
649 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1126 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
55浏览 29评论
110浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
250浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
197浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
54浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 10:03 , Processed in 0.667981 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号