Работа с SPI

Суть проблемы - необходимо управлять матрицей VITA1300 через процессор TexasInstruments TMS320DM365ZCE30 по SPI протоколу.
Особенности VITA1300 - 9 бит на адрес и 16 бит на данные, вся посылка занимает 26 бит.
Особенности TMS320DM365ZCE30 - сдвиговый регистр 16 битный.
Таким образом для пересылки всех моих данных я должен заполнен сдвиговый регистр дважды, но сделать это необходимо во время одной транзакции.
Драйвер с моими отладками и небольшими изменениями:

if (t->tx_buf) {
    tx_data = davinci_spi->get_tx(davinci_spi);
    printk("%s: t->tx_buf\n", __FUNCTION__);
    clear_bits(davinci_spi->base + SPIINT, SPI_SPIINT_MASKALL);
    printk("%s: SPIINT %#x, SPIFLG %#x\n", __FUNCTION__,
        ioread32(davinci_spi->base + SPIINT),
        ioread32(davinci_spi->base + SPIFLG));
 
    while (1) {
        printk("#############################\n");
        data1_reg_val &= ~(0xFFFF);
        data1_reg_val |= (0xFFFF & tx_data);
        printk("%s: data1_reg_val |= (mask & tx_data) %#x |= (0xFFFF & %#x)\n",
            __FUNCTION__, data1_reg_val, tx_data);
 
        buf_val = ioread32(davinci_spi->base + SPIBUF);
        printk("%s: buf_val %#x\n", __FUNCTION__, buf_val);
        printk("%s: buf_val %#x & SPI_SPIBUF_TXFULL_MASK %#x = %#x\n",
            __FUNCTION__, buf_val, SPI_SPIBUF_TXFULL_MASK,
            buf_val & SPI_SPIBUF_TXFULL_MASK);
 
        if ((buf_val & SPI_SPIBUF_TXFULL_MASK) == 0) {
            iowrite32(data1_reg_val, davinci_spi->base + SPIDAT1);
            count--;
        }
 
        tx_data >>= 16;
        printk("%s: SPIFLG %#x\n", __FUNCTION__,
            ioread32(davinci_spi->base + SPIFLG));
 
        if (!count) {
            while (ioread32(davinci_spi->base + SPIBUF)
                & SPI_SPIBUF_RXEMPTY_MASK)
                udelay(1);
            /* getting the returned byte */
            if (t->rx_buf) {
                printk("%s: t->rx_buf\n", __FUNCTION__);
                buf_val = ioread32(davinci_spi->base + SPIBUF);
                printk("%s: buf_val %#x\n", __FUNCTION__, buf_val);
                davinci_spi->get_rx(buf_val, davinci_spi);
            }
        }
        printk("#######################\n");
        if (count <= 0)
            break;
    }

Вывод из драйвера во время работы:
davinci_spi_bufs_pio: t->tx_buf                                                                                                                                                                                    
davinci_spi_bufs_pio: SPIINT 0x0, SPIFLG 0x1000200                                                                                                                                                                  
#############################                                                                                                                                                                                      
davinci_spi_bufs_pio: tx_data 0x9070440, data1_reg_val 0xfe0000, conv 2, count 2                                                                                                                                    
davinci_spi_bufs_pio: data1_reg_val |= (mask & tx_data) 0xfe0440 |= (0xFFFF & 0x9070440)                                                                                                                            
davinci_spi_bufs_pio: buf_val 0x80ff0000                                                                                                                                                                            
davinci_spi_bufs_pio: buf_val 0x80ff0000 & SPI_SPIBUF_TXFULL_MASK 0x20000000 = 0x0                                                                                                                                  
davinci_spi_bufs_pio: SPIFLG 0x1000200                                                                                                                                                                              
davinci_spi_bufs_pio: t->rx_buf                                                                                                                                                                                    
davinci_spi_bufs_pio: buf_val 0x80fe0000                                                                                                                                                                            
davinci_spi_rx_buf_u32: rx 0x80fe0000                                                                                                                                                                              
#######################                                                                                                                                                                                            
#############################                                                                                                                                                                                      
davinci_spi_bufs_pio: tx_data 0x907, data1_reg_val 0xfe0440, conv 2, count 1                                                                                                                                        
davinci_spi_bufs_pio: data1_reg_val |= (mask & tx_data) 0xfe0907 |= (0xFFFF & 0x907)                                                                                                                                
davinci_spi_bufs_pio: buf_val 0x80fe0000                                                                                                                                                                            
davinci_spi_bufs_pio: buf_val 0x80fe0000 & SPI_SPIBUF_TXFULL_MASK 0x20000000 = 0x0                                                                                                                                  
davinci_spi_bufs_pio: SPIFLG 0x1000200                                                                                                                                                                              
davinci_spi_bufs_pio: t->rx_buf                                                                                                                                                                                    
davinci_spi_bufs_pio: buf_val 0x80fe0000
davinci_spi_rx_buf_u32: rx 0x80fe0000                                                                                                                                                                              
#######################

Видно, что посылаемые данные разбиты на два куска и пишутся поочерёдно.
Для контроля доступности записи в сдвиговый регистр в драйвере предусмотрено следующее:
- проверка 29 бита в регистре SPIBUF, принимает значение 0 когда буфер пуст и запись в сдвиговый регистр возможна
davinci_spi_bufs_pio: buf_val 0x80fe0000 & SPI_SPIBUF_TXFULL_MASK 0x20000000 = 0x0
- вывод значения регистра SPIFLG в котором 9 бит характеризует доступность транспортного буфера, принимает значение 1 при пустом буфере
Как видно из вывода проверка на пустоту буфера проходит, вывод значения SPIFLG это подтверждает.

Но, судя по осцилограффу, вторая часть затирает первую в буфере, на экране осцилограффа я вижу только числа 0x9 и 0x7.

Можете что -либо посоветовать как эту ситуацию исправить на уровне драйвера?
Спасибо.

А чем fbtft

А чем fbtft драйвер не устраивает? Если в нём нет поддержки матрицы, то по-моему не очень сложно будет добавить сразу в апстрим.