2017-11-09 23 views
1

TFT LCD 화면 (ILI9163c-160 * 128)을 사용하고 있습니다. athrosAR9331 모듈 spi와 연결됩니다. Athos AR9331은 OpenWRT 리눅스 배포판으로 실행됩니다. 그래서 LCD를 spidev0.1으로 운전하고 있습니다. 화면을 채우거나 LCD에 문자열을 쓰는 동안 인쇄하는 데 너무 많은 시간이 걸립니다. 따라서, 충분한 인쇄 속도를 얻으려면 어떻게해야합니까?TFT LCD 화면 관련 문제

감사합니다.

이 여기에 주요 성능 문제는 데이터의 하드 카피가 힙에 보낼 수 있도록한다는 것입니다

void spi_transactor(unsigned char *write_data, int mode,int size) 
{ 
    int ret; 
    struct spi_ioc_transfer xfer[4]; 

    unsigned char *init_reg; 
    init_reg = (unsigned char*) malloc(size); 
    memcpy(init_reg,write_data,size); 

    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; 
    xfer[0].rx_buf = 0;    //(unsigned long) &buf_rx[0]; 
    xfer[0].len = size;    //wlength + rlength; 
    xfer[0].delay_usecs = 0; 
    xfer[0].speed_hz = speedx;  // 8MHZ 
    //xfer[0].speed_hz = 160000000; // 40MHZ 
    ret = ioctl(spi_fd, SPI_IOC_MESSAGE(1), &xfer); 

    gpio_set_value(_rs, 1); 
} 
+0

일반적으로 말하는 것이 어렵습니다. 속도를 최대로 조정했다고 가정합니다. 가능한 한 많은 데이터를 단일 요청에 압축하려고합니까? 표시하려는 내용에 대해 최적의 표시 명령을 사용하려고합니까? – Ctx

+0

예 ... 사실입니다. 그리고 나는 160 * 128 배열의 전체 이미지를 인쇄해야하기 때문에 가능한 한 많은 데이터를 단일 요청으로 묶으려고합니다. 그래서 나는이 덩어리를 여러 덩어리로 나누고 모든 덩어리를 하나씩 옮기는 것보다. – Logan859

+0

그리고 * fbtft * 드라이버를 배포판에 추가하고 일반 콘솔이나 tty 창으로 사용하는 것은 무엇입니까? – 0andriy

답변

-1

내가 spidev를 사용하여 SPI 핀에 데이터를 기록하기 위해 사용하고 함수는 ...입니다 , 함수가 호출 될 때마다. 또한 항상 동일한 경우에도 매번 처음부터 통신 매개 변수를 설정합니다. 상황을 악화시키기 위해이 함수에는 엄청난 버그가 있습니다. 즉, 내일은없는 것처럼 메모리가 누수됩니다.

SPI 통신은 프로그램이 앉아서 통화 대기 상태로 전환하는 데 너무 많은 시간이 걸리지 않는 한 (오히려) 가능성이 없습니다. 이 경우 수행 할 수있는 작업은 다음과 같습니다.

  • 전체 SPI 비즈니스를 별도의 스레드로 아웃소싱합니다.
  • 좋아하는 ADT를 사용하여 스레드에 대한 작업 큐를 만듭니다. 스레드로부터 안전한 FIFO 여야합니다.
  • 데이터가 호출자에 의해 하드 카피로 ADT에 복사됩니다.
  • 스레드는 ADT에서 하나의 작업 청크를 선택하고 다른 하드 카피를 만들지 않고 거기에서 전송합니다.
  • 스레드는 SPI 통신이 완료 될 때까지 기다린 다음 ADT가 데이터를 삭제 한 다음 다음 데이터를 가져옵니다. 하드 실시간 요구 사항의 경우 이전 메시지를 기다리는 동안 스레드가 다음 메시지를 미리 준비하도록 할 수 있습니다.
  • 통신 매개 변수 "xfer"가 스레드에 의해 으로 설정되면 대/소문자에서 데이터 대상 주소가 변경됩니다.
+0

고맙습니다 ... @ 런든. 나는 당신의 충고로서 나의 코드를 수정하려고 노력할 것이다. 그러나 LCD에 문자열을 인쇄하는 동안이 함수는 모든 문자에 대해 픽셀 단위로 데이터를 인쇄합니다. 그래서, 그 시간은 매우 느립니다. 그 시나리오에서 내가 할 수있는 일. – Logan859

+0

@ Logan859 SPI 작업이 끝날 때까지 기다릴 수있는 방법이 있다면 API를 통해 스레드는 SPI가 완료 될 때까지 해당 스레드를 사용하고 휴면 모드를 사용해야합니다. 그게 가능하지 않다면, 당신은 단지 바쁜 - 대기해야합니다. SPI가 얼마나 느리거나 빠르 느냐에 따라, 그것은 대부분 전송 속도에 달려 있습니다. DMA가 사용 가능한지 알아봐야합니다. 전체 문제를 훨씬 더 우아하게 해결할 것입니다. – Lundin