第一步:在board-mx6q_sabresd.h 中添加spi5 的引脚定义
具体在 mx6q_sabresd_pads[] 数组中添加,如下示:(以下定义是根据硬件工程师要采用
哪个引脚画板决定的,以下的宏都是在bsp 中支持的)
/* ECSPI5 added by Rex 2015.4.21 */ MX6Q_PAD_SD2_CLK__ECSPI5_SCLK, MX6Q_PAD_SD2_DAT0__ECSPI5_MISO, MX6Q_PAD_SD2_CMD__ECSPI5_MOSI, MX6Q_PAD_GPIO_7__ECSPI5_RDY, MX6Q_PAD_SD2_DAT1__ECSPI5_SS0,
第二步:将与SD2 相关的引脚定义及函数注释(不然 spi5的管脚与sd2的管脚是冲突的)
1)board-mx6q_sabresd.h 的 mx6q_sabresd_pads[] 中
/* USDHC2 */ /* // sd2 canceled by Rex @ 2015.4.21 MX6Q_PAD_SD2_CLK__USDHC2_CLK, MX6Q_PAD_SD2_CMD__USDHC2_CMD, MX6Q_PAD_SD2_DAT0__USDHC2_DAT0, MX6Q_PAD_SD2_DAT1__USDHC2_DAT1, MX6Q_PAD_SD2_DAT2__USDHC2_DAT2, MX6Q_PAD_SD2_DAT3__USDHC2_DAT3, */
2)board-mx6q_sabresd.c 中的 mx6_sabresd_board_init() 中
// canceled by Rex @ 2015.4.21 in case conflict between spi5 and sd2 //imx6q_add_sdhci_usdhc_imx(1, &mx6q_sabresd_sd2_data);
第三步:定义片选管脚对应的gpio
在board-mx6q_sabresd.c 中,文件头开始处添加
// spi5 support added by Rex @ 2015.4.20 #define SABRESD_ECSPI5_CS0 IMX_GPIO_NR(1, 14)
这个(1, 14)是根据MY-I.MX6-DEMO-V2.2_V2.5 硬件介绍.pdf 得来的。
我们想要定义 cs0 的gpio 查找 E20 有如下信息:
看到第5行关于gpio的信息即为(1, 14)得来的源由。
第四步:定义spi5的片选数组
// add spi5 cs support by Rex static int mx6q_sabresd_spi5_cs[] = { SABRESD_ECSPI5_CS0, };
第五步:定义spi5 的spi_imx_master 结构体变量
// add spi5 spi_imx_master member static const struct spi_imx_master mx6q_sabresd_spi5_data __initconst = { .chipselect = mx6q_sabresd_spi5_cs, .num_chipselect = ARRAY_SIZE(mx6q_sabresd_spi5_cs), };
第六步:定义 spi5 的spi_board_info 结构体变量
// add spi_board_info member for spi5 by Rex static struct spi_board_info imx6_sabresd_spi5_device[] __initdata = { { .modalias = "spidev", .max_speed_hz = 20000000, /* max spi clock (SCK) speed */ .bus_num = 4, .chip_select = 0, .mode = SPI_MODE_0, }, };
第七步:定义spi5 设备初始化函数
// define spi5 init func by Rex @ 2015.4.21 static void spi5_device_init(void) { spi_register_board_info(imx6_sabresd_spi5_device, ARRAY_SIZE(imx6_sabresd_spi5_device)); }
第八步:在 mx6_sabresd_board_init() 添加 spi5 的初始化代码
// rex add spi5 init imx6q_add_ecspi(4, &mx6q_sabresd_spi5_data); spi5_device_init();
最后,重新编译内核,进行测试即可。