1.config配置
首先是spidev,要在/dev/下面产生设备文件,需要spidev的支持
CONFIG_SPI_SPIDEV=y
使用的是gpio模拟spi,gpio模拟spi的时序原理是bitbang文件实现的,所以这个也需要打开,如果是在openwrt下动态加载的话就是如下两个配置
CONFIG_PACKAGE_kmod-spi-bitbang=y
+CONFIG_PACKAGE_kmod-spi-gpio=y
如果是直接内核的话是如下两个
CONFIG_SPI_BITBANG=y
CONFIG_SPI_GPIO=y
2.arch层添加device和board_info
跟I2C的arch层一样,主要是devices的添加和board_info的添加,如下
//nfc mfrc522
platform_add_devices(bsp_spi_gpio_devs, ARRAY_SIZE(bsp_spi_gpio_devs));
spi_register_board_info(nfc_spi_gpio_board_info,
ARRAY_SIZE(nfc_spi_gpio_board_info));
对于platform_add_devices,因为是使用spi_gpio,所以name是"spi_gpio"这样才可以与driver里面的spi_gpio相互匹配probe到。
因为SPI是可以一个总线上面挂多个,然后通过片选脚CS进行硬件切换,所以这变有个num_chipselect需要设置,如果有2个设置就设置2,一个设备就设置1,这边设置好之后,后面board_info也要有对应的个数,而且片选引脚需要不同。
I2C是通过每个设备有自己不同的地址,通过地址来进行软件切换。
#include
#include
#define SPI_GPIO_BUS_NUM 1
#define SPI_GPIO_SCK 3 /* set gpio 2 as sck */
#define SPI_GPIO_MOSI 1 /* set gpio 3 as MOSI */
#define SPI_GPIO_MISO 0 /* set gpio 4 as MISO */
#define SPI_GPIO_NUM_CHIPSELECT 1 //2
struct spi_gpio_platform_data spi_gpio_info = {
.sck = SPI_GPIO_SCK,
.mosi = SPI_GPIO_MOSI,
.miso = SPI_GPIO_MISO,
.num_chipselect = SPI_GPIO_NUM_CHIPSELECT,
};
struct pla