共享用于闪存和tft LCD的SPI硬件的问题

时间:2017-11-20 11:33:02

标签: c linux-device-driver embedded-linux openwrt spi

我正在使用TFT LCD屏幕(ILI9163c),它与带有spi引脚的athros AR9331模块连接。 Athros AR9331运行OpenWRT linux发行版。所以,我使用我的C应用程序代码用spidev0.1驱动我的LCD。

Athros AR9331电路板使用相同的SPI引脚驱动板载闪存,这是从内核处理的。

我有单独的LCD芯片选择引脚,可以通过使代码从低电平变为高电平来为LCD提供正确的数据识别,但是当LCD上的某些数据传输(使用其他脚本或应用程序)时,LCD屏幕仍会受到垃圾影响我的代码正在打印。

我可以控制LCD芯片选择代码而不是闪存。所以在这种情况下,我应该怎么做才能处理闪存和LCD的操作并行时的情况。

这是我使用SPIdev0.1在LCD上发送数据的功能代码。

    void spi_transactor(unsigned int wlength,
                        unsigned int rlength,
                        const unsigned char write_data,
                        int mode)
    {
       int ret;
       struct spi_ioc_transfer xfer[4];
       unsigned char init_reg[1];

       init_reg[0] = write_data;

       if (mode)
       {
          gpio_set_value(_rs, 1);  // DATA 
       }
       else
       {
          gpio_set_value(_rs, 0);  // COMMAND
       }

       memset(xfer, 0, sizeof xfer);

       xfer[0].bits_per_word = 8;
       xfer[0].tx_buf = (unsigned long) &init_reg[0];
       xfer[0].rx_buf = 0;                        //( unsigned long ) &buf_rx[0];
       xfer[0].len = wlength + rlength;
       xfer[0].delay_usecs = 0;
       xfer[0].speed_hz = speedx;               
       //xfer[0].speed_hz = 40000000;            // 40MHZ

 gpio_set_value(_CS, 0);          // SET ChipSELECT LOW    
       ret = ioctl(spi_fd, SPI_IOC_MESSAGE(1), &xfer);     
 gpio_set_value(_CS, 1);          // SET ChipSELECT HIGH 

       (void) ret;
       //DEBUG_PRINT("%d\n",ret);
       //if (ret <= 0) ; 
       //DEBUG_PRINT("ERROR: %s\n", strerror(errno));

    }

我认为如果我们可以在内核的spidev0.1驱动程序中将我的gpio配置为Chipselect就可以了...但是如何在内核中将gpio配置为chipselect?

1 个答案:

答案 0 :(得分:0)

我在这里找到了类似的东西......

openWRT custom chipselect GPIO

刚从spi驱动程序注册了通用GPIO引脚作为LCD的CS1,最后我解决了我的问题。

谢谢@ A.K,@ user694733