//连接到soc
aliases {
spi1 = &spi_1
};
&spi_1 {
aaaa_spi@0 {
compatible = "AAAAAAAA";
reg = <0>;
spi-max-frequency = <4000000>;
spi-cpha = <0>;
spi-cpol = <0>;
spi-cs-low;
spi-msb-first;
status = "okey";
};
}
驱动框架:
//驱动全局变量
struct spi_device *chaoDevice_spi;
static void chaoDeivce_config_init(struct spi_device* spi)
{
//初始化spi设备成员,dtsi里也可初始化
spi->mode = SPI_MODE_0;
spi->bit_per_word = 8;
spi->max_speed_hz = 19200 * 1000;
spi->chip_select = 0;
//spi->controller_data = &chaoDevice_spi_config;
mdelay(1000);
}
static int chaoDevice_spi_probe(struct spi_device *spi)
{
int ret;
chaoDevice_spi = spi;
chaoDevice_spi_config_init(chaoDevice_spi);
}
static cosnt struct of_device_id chapDeivice_id_table[] = {
{.compatible = "AAAAAAA"},
};
static struct spi_driver chao_spi_driver = {
.driver = {
.name = "chaoDevice_spi",
.bus = &spi_bus_type,
.owner = THIS_MODULE,
.of_match_table = chaoDeivce_id_table,
},
.probe = chaoDevice_probe,
.remove = chaoDevice_remove,
};
static void __exit rc522_spi_exit(void)
{
spi_unregister_driver(&chao_spi_driver);
}
读:
int chaoDevice_spi_read_byte(struct spi_device *spi, uint8_t addr, uint8_t *data)
{
int ret;
struct spi_transfer xfer = {0,};
struct spi_message msg;
//读写buf填充xfer结构体
uint8_t tx_buf[3] = {0,0,0};
uint8_t rx_buf[3] = {0xff,0xff,0x0};
tx_buf[0] = addr & 0xff;
tx_buf[1] = 0x0;
xfer.tx_buf = &tx_buf;
xfer.rx_buf = &rx_buf;
xfer.len = 2;
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
ret = spi_sync(spi, &msg);
if(ret < 0)
{
printk("%s spi read error\n", __func__);
return ret;
}
*data = rx_buf[1];
return ret;
}
写:
int chaoDevice_spi_write_byte(struct spi_device *spi, uint8_t addr, uint8_t data)
{
int ret - 0;
struct spi_transfer xfer = {0, };
struct spi_message msg;
uint8_t tx_buf[3] = {0,0,0};
uint8_t rx_buf[3] = {0,0,0};
tx_buf[0] = addr & 0xff;
tx_buf[0] = data & 0xff;
xfer.tx_buf = &tx_buf;
xfer.rx_buf = &rx_buf;
xfer.len = 2;
spi_message_init(&msg);
spi_message_add_tail(&xfer, &msg);
ret = spi_sync(spi, &msg);
if(ret < 0)
{
printk("%s spi write error", __func__);
return -1;
}
return ret;
}
调用:
unsigned char result = 0;
chaoDevice_spi_read_byte(chaoDevice_spi, 0x22, &result);
chaoDevice_spi_write_byte(chaoDevice_spi, 0x33, 250);
------------------------------
读写总体来看,比较简单,内核核心层已经把api做好了,太底层api的不关注。
从类的角度看,就是实例化一个spi_transfer对象,填充结构体成员,然后通过接口发出去就完事了。
读写字节代码甚至说是差不多,只是读,传回了地址,从地址读出寄存器的值。