Я пытаюсь научиться писать базовый драйвер SPI, а ниже - функция зонда, которую я написал.SPI linux driver
Что я пытаюсь сделать здесь, это установить устройство spi для рамки (datasheet) и использовать spi_sync_transfer()
api description, чтобы получить идентификатор производителя от чипа.
Когда я выполняю этот код, я могу видеть данные на шине SPI с помощью логического анализатора, но я не могу его прочитать с помощью rx-буфера. Я что-то упустил? Может кто-нибудь, пожалуйста, помогите мне с этим?
static int fram_probe(struct spi_device *spi)
{
int err;
unsigned char ch16[] = {0x9F,0x00,0x00,0x00};// 0x9F => 10011111
unsigned char rx16[] = {0x00,0x00,0x00,0x00};
printk("[FRAM DRIVER] fram_probe called \n");
spi->max_speed_hz = 1000000;
spi->bits_per_word = 8;
spi->mode = (3);
err = spi_setup(spi);
if (err < 0) {
printk("[FRAM DRIVER::fram_probe spi_setup failed!\n");
return err;
}
printk("[FRAM DRIVER] spi_setup ok, cs: %d\n", spi->chip_select);
spi_element[0].tx_buf = ch16;
spi_element[1].rx_buf = rx16;
err = spi_sync_transfer(spi, spi_element, ARRAY_SIZE(spi_element)/2);
printk("rx16=%x %x %x %x\n",rx16[0],rx16[1],rx16[2],rx16[3]);
if (err < 0) {
printk("[FRAM DRIVER]::fram_probe spi_sync_transfer failed!\n");
return err;
}
return 0;
}
Здесь очень много проблем с этим кодом. Прежде всего, это ** не ** драйвер SPI. Во-вторых, вы должны понимать, как общаться с SPI в ядре и в пространстве пользователя.В-третьих, вам нужно узнать, как работает аппаратный уровень шины SPI. Какие сигналы у него есть и как они меняются во времени. – 0andriy
Ядро имеет два типа драйверов, которые можно было бы назвать драйверами SPI. Это, по-видимому, функция пробника 'spi_driver', созданная путем регистрации' struct spi_driver' с 'module_spi_driver()'. Поэтому я считаю, что это вполне разумно назвать драйвером SPI. Другой тип - это мастер-драйвер, определяемый 'struct spi_master' и зарегистрированный в' spi_register_master() '. – TrentP
@TrentP, это не главный мастер SPI, я стою исправлен. – 0andriy