闪存和 tft LCD 共享 SPI 硬件的问题
Issue with sharing SPI hardware for flash and tft LCD
我正在使用 TFT LCD 屏幕 (ILI9163c),它通过 spi 引脚与 athros AR9331 模块连接。 Athros AR9331 是 运行 OpenWRT linux 发行版。所以,我正在使用我的 C 应用程序代码用 spidev0.1 驱动我的 LCD。
Athros AR9331 板使用相同的 SPI 引脚驱动板载闪存,由内核处理。
我有单独的芯片 select 用于 LCD 的引脚,通过从代码中将其设置为低电平和高电平来为 LCD 提供正确的数据识别,但在某些数据传输时(使用其他脚本或应用程序)在我的代码进行 LCD 打印时在闪存上。
我可以通过代码控制 LCD 芯片 select 但不能控制闪光灯。所以在这种情况下,当闪光灯和 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 在内核中 ?
我在这里找到了类似的东西...
openWRT custom chipselect GPIO
刚刚从 spi 驱动程序将通用 GPIO 引脚注册为 LCD 的 CS1,最后我解决了我的问题。
谢谢@A.K,@user694733
我正在使用 TFT LCD 屏幕 (ILI9163c),它通过 spi 引脚与 athros AR9331 模块连接。 Athros AR9331 是 运行 OpenWRT linux 发行版。所以,我正在使用我的 C 应用程序代码用 spidev0.1 驱动我的 LCD。
Athros AR9331 板使用相同的 SPI 引脚驱动板载闪存,由内核处理。
我有单独的芯片 select 用于 LCD 的引脚,通过从代码中将其设置为低电平和高电平来为 LCD 提供正确的数据识别,但在某些数据传输时(使用其他脚本或应用程序)在我的代码进行 LCD 打印时在闪存上。
我可以通过代码控制 LCD 芯片 select 但不能控制闪光灯。所以在这种情况下,当闪光灯和 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 在内核中 ?
我在这里找到了类似的东西...
openWRT custom chipselect GPIO
刚刚从 spi 驱动程序将通用 GPIO 引脚注册为 LCD 的 CS1,最后我解决了我的问题。
谢谢@A.K,@user694733