嗨喽,大家好,我是程序猿老王,程序老王就是我。
今天给大家讲一讲Linux内核中怎么添加spi flash驱动。
1. 设备树中添加的spi部分
1.1 AM5728设备树文件
am57xx-idk-common.dtsi
1.2 添加节点
在设备树中添加spigpio节点如下代码,见下图:
1.3 spigpio的管脚定义
查看硬件原理图主控板(底板V5-ANT_CARRIER_BOARD_V5.2.pdf和蚂蚁 5728-原理图SH-801001000026-04.pdf)和芯片手册(am5728_2.pdf)
上图只是底板原理图的管脚定义,由于该项目使用底板+扣板,因此需要看AM572部分的管脚定义
根据图中AM5728芯片的A25、B25在手册《am5728_2.pdf》4.2 Ball Characteristics章节中查找到具体的gpio管脚号,其他管脚相同方法。
1.4 添加pinmux的配置
在设备树中添加spigpio pinmux的配置
pinctrl-single,pins的配置
上图的这份DTS的代码中,规定了寄存器是从0x1400 开始, 所以在 AM572xSitara™ Processors Silicon Revision 2.0, 1.1 Texas Instruments Sitara™ Family of Products Technical Reference Manual (Rev.pdf 18.5 CONTROL_MODULE Registers 有相关的地址标示, 但是在 `*.dts ` 里面的代码是偏移了 0x1400 地址的,所以有如下代码:
flash_gpio_pins: flash_gpio_pins
{
pinctrl-single,pins = <
0x3A4 (PIN_INPUT | MUX_MODE14) /*A25 SPI1_SCLK*/
0x3AC (PIN_INPUT | MUX_MODE14) /*B25 SPI1_D0*/
0x2B0 (PIN_INPUT | MUX_MODE14) /*J14 MCASP1_FSR*/
0x80 (PIN_INPUT | MUX_MODE14) /*U1 GPMC_A16/QSPI1_D0*/
>;
};
对应的TRM描述如下所示:
2. 添加配置编译项
2.1修改配置文件
在配置文件quarkant_defconfig中查看一下配置项是否打开
CONFIG_SPI_GPIO=m /*m:编译成模块.ko*/
CONFIG_SPI_SPIDEV=y
CONFIG_SPI_BITBANG=y
CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y
CONFIG_MTD=y
3. 添加flash型号
在/driver/mtd/devices/m25p80.c文件中p_ids数组中是否有“s25fl064km25”型号,如果没有,则在数组中添加该型号。
4. /dev/mtd0设备
4.1 AM5728启动后spi-gpio.ko加载成功后在/dev/下回多一个mtd0设备,如想使/dev/mtd0名称变为/dev/mtd7
4.2 在/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c文件中
int add_mtd_device(struct mtd_info *mtd)函数中
将i = idr_alloc(&mtd_idr, mtd, 0, 0, GFP_KERNEL);
修改为#define START_ID 7
i = idr_alloc(&mtd_idr, mtd, START_ID, 0, GFP_KERNEL);
5.在shell下进行读写flash测试
5.1读取flash数据到fpga.bin文件
insmod /*/spi-gpio.ko
dd if=/dev/mtd0 of=fpga.bin bs=1024 count=2000
5.3写fpga.bin文件数据到flash
dd if=fpga.bin of=/dev/mtd0 bs=1024 count=2000
-END-
关于更多嵌入式C语言、FreeRTOS、RT-Thread、Linux应用编程、linux驱动等相关知识,关注公众号【嵌入式Linux知识共享】,后续精彩内容及时收看了解。