2013-08-28 4 views
0

Я lookig в код, который пишет некоторые данные по SPI линии, используя структуруЧто tx_buf ожидает в качестве входных данных в spi_transfer

struct spi_transfer 
{ 
const void * tx_buf; 
void * rx_buf; 
unsigned len; 
dma_addr_t tx_dma; 
dma_addr_t rx_dma; 
unsigned cs_change:1; 
u8 bits_per_word; 
u16 delay_usecs; 
u32 speed_hz; 
struct list_head transfer_list; 
}; 

spi_transfer Теперь некоторые, как это было сделано в Кодексе

u8 *cmd 
cmd=kmalloc(3,GFP_KERNEL); 
cmd[0]=16; 
cmd[1]=32; 

Теперь t [0] .tx_buf = cmd;

сейчас мне интересно, что записывается в этот буфер и что tx_buf ожидает здесь? Мы подписываемся на какой-то счетчик часов для собак через линию SPI.

+0

'cmd' содержит указатель на данные. И этот указатель присваивается 'tx_buf', который должен« указывать »на данные передачи. Следовательно, теперь 'tx_buf' указывает на данные передачи. –

+0

Итак, что записывается на линии spi в первую очередь, это значение 16, записанное в строке сначала –

+0

Вам нужно будет изучить код, где он записывается в буфер данных SPI (регистр данных передачи). Поскольку это ничего не пишет для SPI, это просто указывает на данные, которые должны быть записаны. –

ответ

1

Похоже, вы отправляете байты 0x10, 0x20, 0x00 на устройство SPI. Должен быть другой код, который определил и инициализировал остальную часть struct spi_transfer t []. Следует отметить, что t [0] .len должно быть установлено равным 3.

Возможно, ваша база кода предназначена для модуля модуля/драйвера устройства. Функции spi_message_add_tail() и т. Д. Находятся в источнике ядра include/linux/spi/spi.h. Они не являются динамическими модулями, но ваш модуль будет связан с ядром при загрузке вашего модуля.

Проверьте источник ядра для примеров использования инфраструктуры SPI, например. драйверы/база/regmap/regmap-spi.c.

+0

t [0] .len = 1 задан в нашем коде, не могли бы вы сообщить мне, что он делает? –

+0

Это отправит только один байт, значение 0x10. Непонятно, почему ваш код коснулся cmd [1]. Из кода, который вы включили «kmalloc (3 ...», оказалось, что len будет 3. Вот выдержка из исходного кода ядра '* struct spi_transfer - пара буфера чтения/записи * tx_buf: данные, которые должны быть записаны (dma -безопасная память) или NULL ... * len: размер буферов rx и tx (в байтах) ' –