使内核支持NOR FLASH分区

本文介绍如何修改2.6.14内核以支持自定义NORFLASH分区,包括调整分区大小及位置,确保内核能够适应更大的空间需求,避免因空间不足导致系统无法启动的问题。
使内核支持NOR FLASH分区
由于华恒的NOR FLASH的默认分区是
0x00000000 – 0x00040000 “ppcboot”
0x00040000 – 0x00140000 “kernel”
0x00140000 – 0x00540000 “ramdisk”
0x00540000 – 0x00740000 “cramfs”
0x00740000 – 0x00800000 “jffs2”
按照这样的分区,给内核的空间只有1M大小,若编译出的内核大于1M,就不能完整烧写进FLASH,系统是绝对启动不了的,所以,在下载内核前,我们要先让内核支持对NOR FLASH分区;步骤如下:
1. 根据网上资料,知道cfi_flagadm.c文件的驱动结构与NOR FLASH的相似,所以,我们可以修改cfi_flagadm.c驱动来实现内核对NOR FLASH分区的支持;
在2.6.14内核目录下,执行命令:
# cd drivers/mtd/maps
# cp cfi_flagadm.c  HH_s3c2410.c
# vim HH_s3c2410.c
找到宏定义
 #define FLASH_PHYS_ADDR 0X40000000
 #define FLASH_SIZE 0X400000
根据16M NOR FLASH,将其修改如下:
 #define FLASH_PHYS_ADDR 0X00000000 //FLASH起始地址
 #define FALSH_SIZE 0x1000000   //FLASH大小 16M
同时,将FLASH_PARTITION0_ADDR等分区信息修改如下:
 #define FLASH_PARTITION0_ADDR 0x00000000 //bootloader分区起始地址
 #define FLASH_PARTITION0_SIZE  0x00040000 //bootloader分区大小256k
 
 #define FLASH_PARTITION1_ADDR 0x00040000 //kernel分区起始地址
 #define FLASH_PARTITION1_SIZE  0x00200000 //kernel分区大小 2MB
 #define FLASH_PARTITION2_ADDR 0x00240000 //ramdisk分区起始地址
 #define FLASH_PARTITION2_SIZE  0x00400000 //ramdisk分区大小 4MB
 #define FLASH_PARTITION3_ADDR 0x00640000 //jffs分区起始地址
 #define FLASH_PARTITION3_SIZE  0x00700000 //jffs分区大小 7MB
根据自己习惯,更改结构体实例struct mtd_partition flagadm_parts[]内的分区名称,或不修改也行;
保存退出!
2.在内核编译选项中添加HH_s3c2410的编译选项;
# cd drivers/mtd/maps
# vim Konfig
 在 menu “Mapping drivers for chip access”
   depends on MTD!=n
   下添加
    config HH_NOR_FLASH_SUPPORT
     tristate “HH_NOR_FLASH_SUPPORT”
     help
      help
   保存退出!
  # vim Makefile
   在 # Chip mappings下添加
   obj-$(CONFIG_HH_NOR_FLASH_SUPPORT) += HH_s3c2410.o
  保存退出!
 这样,就可以在内核根目录下通过make menuconfig选择编译NOR FLASH分区驱动了;
 # make menuconfig
 Device Drivers->
  Memory Technology Devices(MTD)->
   [*] Memort Technology Device(MTD) support
   [*] MTD partitioning support     //MTD设备分区支持
   [*] Caching block device assess to MTD devices   //未测试是否必须
   Mapping drivers for chip access->
    [*] HH_NOR_FLASH_SUPPORT

 这样就可以使2.6.14内核支持NOR FLASH重新分区了!


<think>嗯,用户现在想了解LicheePi支持Nor Flash所需的内核配置和相关选项,特别是提到了CONFIG_ARM_CCI。首先,我需要回忆一下LicheePi的硬件配置,通常它可能使用的是Allwinner的芯片,比如D1或者RISC-V架构的,但用户之前的问题涉及到ARM架构的配置,比如CONFIG_ARM_CCI,所以可能需要确定具体的硬件型号。 首先,Nor Flash的支持通常涉及到MTD子系统,因此内核中的MTD相关配置必须启用。包括MTD核心支持、CFI接口、映射驱动等。比如CONFIG_MTD、CONFIG_MTD_CFI、CONFIG_MTD_JEDECPROBE这些选项都是必须的。此外,具体的硬件平台可能还需要SPI NOR驱动,比如CONFIG_MTD_SPI_NOR。 接下来是CONFIG_ARM_CCI,这个配置项主要用于ARM的缓存一致性互连总线,通常在多核处理器中用于维护缓存一致性。但Nor Flash的支持可能不直接依赖于CCI,除非涉及到DMA操作或者多核之间的数据一致性。需要确认用户提到的LicheePi是否使用多核ARM处理器,并且Nor Flash的访问是否需要通过CCI总线。如果不需要,可能用户在这里有误解,或者可能有其他配置项关联。 另外,用户之前的问题涉及到Linux内核配置,特别是设备树和驱动程序的配置。在LicheePi中,Nor Flash可能连接到SPI控制器,因此需要启用对应的SPI驱动,比如CONFIG_SPI_SUNXI(如果是Allwinner芯片)。同时,设备树中需要正确配置SPI节点和Flash的节点,包括兼容性字符串、寄存器地址、分区表等。 可能还需要考虑时钟配置和引脚复用,确保SPI控制器的时钟和引脚正确初始化。此外,文件系统支持如UBIFS或JFFS2也可能需要配置,如果用户打算在Nor Flash上挂载文件系统。 需要检查用户提供的引用,但用户提到之前的引用仅供参考,所以可能主要依赖现有的知识。可能需要分步骤回答,先列出Nor Flash所需的通用配置,然后根据LicheePi的具体硬件添加特定配置,最后解释CONFIG_ARM_CCI在此处是否相关,或者是否需要其他配置。 另外,用户可能混淆了不同的配置项,需要明确说明CONFIG_ARM_CCI与Nor Flash支持的关系,避免误导。如果CONFIG_ARM_CCI不相关,应指出并建议正确的配置路径。同时,提供验证步骤,如检查设备树、查看内核日志、测试Flash访问等,帮助用户确认配置是否正确应用。</think>#### LicheePi Nor Flash支持的内核配置详解 --- ### 一、核心配置项分类 | 配置类型 | 关键配置项 | 作用说明 | |----------------|--------------------------|-------------------------------------------------------------------------| | **MTD基础支持** | `CONFIG_MTD` | 启用内存技术设备(MTD)子系统,所有Flash操作的基础[^1] | | **Flash接口** | `CONFIG_MTD_CFI` | 支持Common Flash Interface规范,用于识别标准NOR Flash | | | `CONFIG_MTD_JEDECPROBE` | 启用JEDEC ID探测,识别现代NOR Flash芯片 | | **SPI控制器** | `CONFIG_SPI_SUNXI` | LicheePi(全志芯片)专用SPI控制器驱动,如D1/H616等平台 | | **SPI NOR支持** | `CONFIG_MTD_SPI_NOR` | 启用SPI NOR Flash通用支持 | | **硬件映射** | `CONFIG_MTD_PHYSMAP` | 物理地址映射支持,需配合设备树定义具体映射区域 | | **分区支持** | `CONFIG_MTD_PARTITIONS` | 允许对Flash进行分区管理 | --- ### 二、LicheePi专用配置 #### 1. **设备树配置示例(以全志D1为例)** ```dts // SPI控制器节点(需与SoC手册核对基地址) spi0: spi@4025000 { compatible = "allwinner,sun20i-d1-spi"; reg = <0x4025000 0x1000>; clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_SPI0>; resets = <&ccu RST_BUS_SPI0>; #address-cells = <1>; #size-cells = <0>; status = "okay"; // NOR Flash设备节点 flash@0 { compatible = "jedec,spi-nor"; reg = <0>; spi-max-frequency = <50000000>; #address-cells = <1>; #size-cells = <1>; // 分区定义(需按实际Flash容量调整) partition@0 { label = "u-boot"; reg = <0x000000 0x080000>; }; partition@080000 { label = "env"; reg = <0x080000 0x010000>; }; }; }; ``` #### 2. **内核配置验证方法** ```bash # 检查MTD设备注册 $ dmesg | grep -i mtd [ 2.150000] spi-nor spi0.0: w25q128 (16384 Kbytes) # 查看MTD分区 $ cat /proc/mtd dev: size erasesize name mtd0: 00080000 00001000 "u-boot" mtd1: 00010000 00001000 "env" ``` --- ### 三、配置步骤详解 #### 1. **基础配置(menuconfig)** ```bash make ARCH=riscv menuconfig # D1使用RISC-V架构,其他型号需调整ARCH参数 ``` 路径导航: ``` -> Device Drivers -> Memory Technology Device (MTD) support [*] MTD support -> Mapping drivers for chip access [*] CFI Flash device in physical memory map (CONFIG_MTD_PHYSMAP) -> Self-contained MTD device drivers [*] SPI-NOR device support (CONFIG_MTD_SPI_NOR) ``` #### 2. **SPI控制器启用** ``` -> Device Drivers -> SPI support [*] Sunxi SPI controller (CONFIG_SPI_SUNXI) ``` --- ### 四、`CONFIG_ARM_CCI`关联性说明 该配置项**与NOR Flash支持无直接关系**,其作用为: 1. ARM多核处理器(如Cortex-A系列)的缓存一致性总线控制 2. 主要涉及CPU间数据同步,不参与SPI外设操作 **仅在以下场景需要关注**: - 使用ARM多核处理器(如LicheeRV 86 Panel采用ARM Cortex-A53) - Flash访问涉及DMA操作时需维护缓存一致性 --- ### 五、常见问题解决 | 问题现象 | 解决方法 | |---------------------------|-------------------------------------------------------------------------| | 无法识别Flash芯片 | 1. 检查`spi-max-frequency`是否超出Flash规格<br>2. 确认电压模式匹配(3.3V vs 1.8V)| | 出现"SPI transfer failed" | 检查设备树中`clocks`定义是否正确,需包含SPI控制器时钟和模块时钟 | | 分区表未生效 | 确保`CONFIG_MTD_CMDLINE_PARTS`或`CONFIG_MTD_OF_PARTS`已启用 | --- ### 六、扩展验证测试 #### 1. **Flash读写测试** ```bash # 擦除测试 flash_erase /dev/mtd0 0 0 # 写入测试 echo "TEST" > /tmp/test.txt nandwrite -p /dev/mtd0 /tmp/test.txt # 读取验证 dd if=/dev/mtd0 bs=1 count=4 2>/dev/null ``` #### 2. **性能监测** ```bash # 查看SPI传输速率(需CONFIG_DEBUG_FS) cat /sys/kernel/debug/spi/spi0.0/device/cs_mode ``` --- ### 七、相关参考 1. 全志D1芯片手册第12章 "SPI Controller" [^2] 2. Linux MTD文档:`Documentation/mtd/` [^3] 3. JEDEC标准JESD216B(SPI NOR Flash识别规范)[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值