请教龙芯1C智龙主板如何驱动LCD
本帖最后由 szhm 于 2015-9-2 15:31 编辑见到大家在搞智能硬件,本人是新手,就从开发板最基本的液晶屏入手吧,一个原因本人所在公司是从事液晶屏和触摸屏生产制造,不过本人的工作和液晶屏、触摸屏无关,只是维护公司管理软件的小程序员而已.
LCD接口繁多:MCU、RGB、SPI、I2C、VSYNC、MDDI、DSI、MIPI、LVDS、TTL,够吓倒人,无从入手。
嵌入式主板/CPU 有的带GPU的,有的仅带LCD控制器的;液晶屏带LCD驱动器的芯片种类/厂家也繁多.
触摸屏又分电容式触摸屏和电阻式触摸屏.我查看了公司的触摸屏,电容式触摸屏含有IC,电阻式触摸屏不含IC
所以本人想从最简单入手,龙芯1C智龙主板应支持下面方式:
CPU 液晶屏
--------------------------------
LCD控制器--(直接)-->LCD驱动器
TTL --(直接)-->TTL
CPU ADC控制器--(直接)-->触摸屏
特此请各位指点迷津
1.龙芯1C智龙主板支持市面上那些液晶屏(LCD驱动芯片)?
2.龙芯1C linux内核驱动支持那些液晶屏(LCD驱动芯片)?
3.linux内核LCD驱动框架是那个部分?有没有框架可套用?可在那个地方尽量少增加,少改动?
4.龙芯1C linux内核是否可直接驱动电阻式触摸屏?
我已从同事硬件工程师讨要到带电阻式触摸屏的TFT液晶屏(应该是客户定制,市面不流通),2.8寸,240*320 ,LCD驱动芯片是Sitronix的ST7789V-G.
就一块IC ,所以电阻式触摸屏应该可由CPU的ADC驱动.
在网上很难找到IC的规格文档资料,是不是整个IC行业都不公开IC文档?
当然我可内部从同事讨要芯片公司的IC资料,是不是违反职业操守,呵呵
过段时间会出带液晶屏的扩展板 肯定要有ST7789V-G的资料吧 我在淘宝上的“龙芯1c开发板”里看见如下描述
支持4.3寸和7寸LCD显示屏
40针LCD接口引出了LCD控制器和触摸屏的全部信号
使用4.3寸LCD,最高分辨率支持480x272
触摸屏使用一片SPI转换芯片XPT2046
可以在淘宝上“龙芯1B开发板”,有个4.3寸lcd的开发板照片,7寸的lcd可以用群创的。
本帖最后由 szhm 于 2015-10-28 09:54 编辑
本人已从同事硬件工程师要到LCD驱动器是ILI9341芯片的TFT液晶屏,ILI9341市面较常见,芯片资料易找到,源码例子也多.同事是使用51单片机模拟SPI方式驱动液晶屏.本人能力有限,就直接参照同事程序.
1.ILI9341特性
1)分辨率
240x320
2)接口
MCU、RGB、SPI
SPI(串行外围设备接口)又分3线和4线
2.1)3线
9位
又分
串行接口I:CSX、SCL、SDA
串行接口II :CSX、SCL、SDI、SDO
CSX片选
SCL串行时钟
SDA串行数据(双向)
SDI串行数据输入(对ILI9341而言)
SDO串行数据输出(对ILI9341而言)
2.2)4线
8位
比3线多了一根D/CX(数据/命令选择)
2.3)3线比4线多发一位就是相当于数据/命令选择
3)颜色
3线SPI支持RGB565(16位 65k colors)、RGB666(18位262k colors)
RGB565即红5位、绿6位、蓝5位
如何从24/32位颜色值转换为16位的RGB565,这里不表,仅列出RGB565三基色
颜色 16进制值
-----------------------
红 0xF800
绿 0x07E0
蓝 0x001F
4)引脚
RESX复位reset,初始化ILI9341芯片,必需的
在ILI9341手册上,对某些引脚有如下的描述:
4.1)If not used,this pin should be connected to VDDI or VSS(地)
4.2)Fix to VSS level when not in use
4.3)If not used,open this pin(悬空)
如RGB接口的DOTCLK、VSYNC、HSYNC、DE(data enable)、D0~D17(RGB)不用时必需接地--此处不详读手册很容易被忽略(还好有同事指点)
SPI接口的SDO不用时,悬空(即什么都不接)
2.LS1C
龙芯LS1C集成LCD控制器、SPI控制器(仅作为主控端,SPI0和SPI1两个),都可驱动LCD,本人能力有限,不表.
本文的方案采用GPIO模拟SPI(3线)驱动液晶屏
1)
LS1C pmon是支持ILI9341的,参见pmon源码../sys/dev/lcm/ili9341.c,可见使用GPIO78、GPIO79、GPIO83,并查<LS1C数据手册>的引脚复用,其对应着SPI控制器.
引脚 GPIO 说明
---------------------------------------------------
SPI_CLK GPIO78 <LS1C数据手册>是SPI_CLK,而<智龙V1.0主板外观图>却标注SPI0_CLK.不懂SPI0和SPI1是分别的CLk还是共一个CLK?
SPI0_MOSI GPIO79 串行数据输出(对LS1C而言)
SPIO_CS2 GPIO83 <智龙V1.0主板外观图>找不到该引脚
SPI0_CS3 GPIO84 本文选GPIO84
pmon源码虽对应着SPI控制器,但却是当作GPIO模拟SPI
<智龙V1.0主板外观图>中上方两行有标注SPI等引脚
当选用SPI引脚作GPIO,会与TF卡冲突;当挂载TF卡,运行本文程序(选用了GPIO78、GPIO79、GPIO84),会提示MMC闪存被移除.
<智龙V1.0主板外观图>中上方两行有标注GPIO46~GPIO57,查<LS1C数据手册>对应CAM摄像头(并可复用作UART),大概系统启动没用到吧,所以GPIO模拟SPI还是选GPIO46~GPIO57.
2)
选GPIO46作RESET复位
3)
linux提供了一个通用的用户空间GPIO操作接口,就是读写/sys/class/gpio,犹如操作文件.本文用操作文件方式用来模拟SPI效率低下,仅为编程方便、实验而已.
3.液晶屏
本液晶屏是仅带FPC,网购了FPC转接板(空白的),同事帮焊了FPC接接器及排针.液晶屏接到转接板,再用杜邦线连接转接板的排针和智龙V1.0主板的插槽.
4.连接
液晶屏引脚序号/名称 主板(对照<智龙V1.0主板外观图>)
-----------------------------------------------------------------
1 TOP LAYER MESH 1 IN
2 TOP LAYER MESH 2 IN
3 BOTTOM LAYER MESH 1 IN
4 BOTTOM LAYER MESH 2 IN
5 GND DGND
6 X-
7 Y-
8 X+
9 Y+
10 VCI VDD33
11 GND DGND
12 /RESET GPIO46
13 /CS SPI0_CS3
14 SCL SPI_CLK
15 VSYNC DGND
16 HSYNC DGND
17 ENABLE DGND
18 DOTCLK DGND
19 SDI SPI0_MOSI
20~25 B0~B5 DGND
26~31 G0~G5 DGND
32~37 R0~R5 DGND
38 SDO
39 IOVCC VDD33
40 LED_A1 VDD33
41 LED_A2
42 LED_A3
43 LED_K DGND
44 GND DGND
45 BOTTOM LAYER MESH 2 OUT
46 BOTTOM LAYER MESH 1 OUT
47 TOP LAYER MESH 2 OUT
48 TOP LAYER MESH 1 OUT
说明:
1)主板一列空白处表示不连接
2)主板没那么多GND,用铜丝(将一条杜邦线拨掉皮)将液晶屏的VSYNC、HSYNC、ENABLE、DOTCLK、B0~B5、G0~G5、R0~R5短接,再接到主板的GND
3)主板没那么多VDD,背光源LED_A1~3选一个LED_A1接VDD也足够亮
5.源码
// spilcd.c
// spi 3线
// ILI9341引脚定义
#define RST"46"
// 下面GPIO会与TF卡冲突,最好选GPIO47~GPIO49
#define SDA"79"
#define SCL"78"
#define CS "84"
void s_send(unsigned char X)
{ int j=8;
do
{
if(X&0x80)
system("echo 1 > /sys/class/gpio/gpio"SDA"/value");
else
system("echo 0 > /sys/class/gpio/gpio"SDA"/value");
system("echo 0 > /sys/class/gpio/gpio"SCL"/value");
system("echo 1 > /sys/class/gpio/gpio"SCL"/value");
--j;
X<<=1;
}while(j);
}
void s_com(unsigned char X) //写命令
{
system("echo 0 > /sys/class/gpio/gpio"CS"/value");
system("echo 0 > /sys/class/gpio/gpio"SDA"/value"); // 3线,先发一位: 命令 -- 0
system("echo 0 > /sys/class/gpio/gpio"SCL"/value");
system("echo 1 > /sys/class/gpio/gpio"SCL"/value");
s_send(X);
system("echo 1 > /sys/class/gpio/gpio"CS"/value");
}
void s_data(unsigned char X) //写数据
{
system("echo 0 > /sys/class/gpio/gpio"CS"/value");
system("echo 1 > /sys/class/gpio/gpio"SDA"/value"); // 3线,先发一位: 数据 -- 1
system("echo 0 > /sys/class/gpio/gpio"SCL"/value");
system("echo 1 > /sys/class/gpio/gpio"SCL"/value");
s_send(X);
system("echo 1 > /sys/class/gpio/gpio"CS"/value");
}
void coordinate(unsigned int col,unsigned int page)
{
s_com(0x2a); //Column Address Set
s_data(0x00);
s_data(col);
s_data(0x00);
s_data(0xef);
s_com(0x2b); //Row Address Set
s_data((page&0xff00)>>8);
s_data(page&0x00ff);
s_data(0x01);
s_data(0x3f);
s_com(0x2c); //Memory Write
}
void main (void)
{ system("echo "CS" > /sys/class/gpio/export && echo out > /sys/class/gpio/gpio"CS"/direction");
system("echo "SDA" > /sys/class/gpio/export && echo out > /sys/class/gpio/gpio"SDA"/direction");
system("echo "SCL" > /sys/class/gpio/export && echo out > /sys/class/gpio/gpio"SCL"/direction");
system("echo "RST" > /sys/class/gpio/export && echo out > /sys/class/gpio/gpio"RST"/direction");
// LCD Reset
system("echo 0 > /sys/class/gpio/gpio"RST"/value");
system("echo 0 > /sys/class/gpio/gpio"RST"/value");
sleep(1);
system("echo 1 > /sys/class/gpio/gpio"RST"/value");
system("echo 1 > /sys/class/gpio/gpio"RST"/value");
sleep(1);
//--^-- ILI9341初始化开始
// 初始化部分是照抄51单片机程序.就是发送命令/数据,具体代表什么意思需参考ILI9341手册
s_com(0xCF);
s_data(0x00);
s_data(0x81);
s_data(0x30);
s_com(0xED);
s_data(0x64);
s_data(0x03);
s_data(0x12);
s_data(0x81);
s_com(0xE8);
s_data(0x85);
s_data(0x10);
s_data(0x78);
s_com(0xCB);
s_data(0x39);
s_data(0x2C);
s_data(0x00);
s_data(0x34);
s_data(0x02);
s_com(0xF7);
s_data(0x20);
s_com(0xEA);
s_data(0x00);
s_data(0x00);
s_com(0xB1);
s_data(0x00);
s_data(0x13);
s_com(0xB6);// Display Function Control
s_data(0x0A);
s_data(0xA2);
s_com(0xC0);//Power control
s_data(0x21); //VRH
s_com(0xC1);//Power control
s_data(0x11); //SAP;BT
s_com(0xC5);//VCM control
s_data(0x3F);
s_data(0x3C);
s_com(0xC7);//VCM control2
s_data(0xa4);
s_com(0x36);// Memory Access Control
s_data(0x08);
s_com(0x3A);// Pixel Format Set
s_data(0x55);
s_com(0xF2);// 3Gamma Function Disable
s_data(0x00);
s_com(0x26);//Gamma curve selected
s_data(0x01);
s_com(0xE0);//Set Gamma
s_data(0x0F);
s_data(0x26);
s_data(0x24);
s_data(0x0B);
s_data(0x0E);
s_data(0x09);
s_data(0x54);
s_data(0xA8);
s_data(0x46);
s_data(0x0C);
s_data(0x17);
s_data(0x09);
s_data(0x0F);
s_data(0x07);
s_data(0x00);
s_com(0xE1);//Set Gamma
s_data(0x00);
s_data(0x19);
s_data(0x1B);
s_data(0x04);
s_data(0x10);
s_data(0x07);
s_data(0x2A);
s_data(0x47);
s_data(0x39);
s_data(0x03);
s_data(0x06);
s_data(0x06);
s_data(0x30);
s_data(0x38);
s_data(0x0F);
s_com(0x11); //Exit Sleep
sleep(1);
s_com(0x29); //Display on
s_com(0x22);
s_data(0x00);
sleep(1);
//--^-- ILI9341初始化结束
coordinate(0,0);//窗口坐标
int i,j;
for(j=240;j>0;j--)
{ // 绿 0x07E0
for(i=320;i>0;i--)
{ s_data(0x07);
s_data(0xe0);
}
}
system("echo "SDA" > /sys/class/gpio/unexport");
system("echo "SCL" > /sys/class/gpio/unexport");
system("echo "CS" > /sys/class/gpio/unexport");
system("echo "RST" > /sys/class/gpio/unexport");
}
6.编译
1)环境
龙芯2F笔记本逸珑8089,debian 9,o32
2)编译为静态可执行文件
loongson@debian:~$ gcc -static -o spilcd spilcd.c
7.运行
程序复制到智龙根目录下运行
#./spilcd
因是操作/sys/class/gpio,极其慢,但终可驱动LCD了,可见一点一点填充绿色.
8.参考资料
https://github.com/上有很多ILI9341例子
ILI9341手册网上可搜到
<openloongson-kernel源码>的../arch/mips/loongson/ls1x/video_modes.c
本站的<初探驱动开发过程,LCD9341屏>
赞! 上面的是模拟SPI方式.想尝试龙芯1C硬件SPI驱动LCD,<LS1C用户手册>里的SPI寄存器都是8位的.ILI9341支持4线,即8位,外加一根D/CX(数据/命令选择),但我的液晶屏没引出D/CX .所以又只能用SPI 3线,即9位(先发一位数据/命令选择).
问题是硬件SPI怎只发一位?查找网上说'每次写数据前把SPI口设置为推挽输出模式',先发该一位数据/命令的方式与模拟SPI相同,只是在发8位时用硬件SPI.我查了<LS1C用户手册>,都没有推挽输出模式的有关描述,而网上查到都是有关单片机方面的推挽输出.
请问各位龙芯1C是否有所谓的推挽输出?我也不懂什么推挽输出 本帖最后由 szhm 于 2016-5-6 08:36 编辑
论坛要修改头像才能发贴,呵呵
因不懂推挽输出,试下用gpio的复用功能,也能驱动LCD.
本程序是本人学习龙芯1C各硬件寄存器的用法,没实际用途
1.源码
// spilcd.c
// 硬件spi 3线
// 同样3线,9位;先用gpio模拟发一位数据/命令,再用硬件SPI发8位;已成功点亮LCD
#include <sys/types.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <memory.h>
/*
SPI0 基址是 0xbfe80000,其最高三位清零得物理地址0x1FE80000
本程序是用户态驱动,mmap()映射物理地址
如是内核程序或无操作系统的裸机程序,应使用0xbfe80000
*/
#define spi_base 0x1FE80000
// 控制寄存器相对于基址的偏移
#define REG_SPCR 0x00 //控制寄存器
#define REG_SPSR 0x01 //状态寄存器
#define REG_SPDR 0x02 //数据传输寄存器
#define REG_SPER 0x03 //外部寄存器
#define REG_SPCS 0x05 //片选
#define RST"46"//ILI9341复位
//SPI0对应了GPIO78、GPIO79、GPIO84,落在GPIO2
#define SDA79
#define SCL78
#define CS 84
#define gpio_base 0x1FD010C8//GPIO2--gpio组2
#define GPIO_CFG 0x00
#define GPIO_EN0x10
#define GPIO_OUT 0x30
void *mapgpio_base;
void gpio_exportout(unsigned int gpio2)
{
*(volatile unsigned int*)(mapgpio_base+GPIO_CFG)|= (1 << (gpio2-64)) ;/*置1,GPIO有效;GPIO2,要减64*/
*(volatile unsigned int*)(mapgpio_base+GPIO_EN)&=(~(1 << (gpio2-64)));/*置0,方向输出*/
}
void gpio_setvalue(unsigned int gpio2,int value)
{ if (value)
*(volatile unsigned int*)(mapgpio_base+GPIO_OUT)|=(1 << (gpio2-64)) ;//输出1
else
*(volatile unsigned int*)(mapgpio_base+GPIO_OUT)&=(~(1 << (gpio2-64)));//输出0
}
void gpio_unexport(unsigned int gpio2)
{
*(volatile unsigned int*)(mapgpio_base+GPIO_CFG)&=(~(1 << (gpio2-64)));//置0 ,GPIO无效
}
void *mapspi_base;
void s_send(unsigned char X) //硬件spi
{ unsigned char c;
*(volatile unsigned char*)(mapspi_base+REG_SPDR)=X ;//往传输寄存器写入数据
while ((*(volatile unsigned char*)(mapspi_base+REG_SPSR)) & 0x01);/*直接在此循环判断状态寄存器(没使用中断方式)*/
c=(*(volatile unsigned char*)(mapspi_base+REG_SPDR)) ;//即使从设备没发数据也必须进行读出操作
}
void s_com(unsigned char X) //写命令
{ gpio_exportout(CS);
gpio_exportout(SDA);
gpio_exportout(SCL);
gpio_setvalue(CS,0);
gpio_setvalue(SCL,0);
gpio_setvalue(SDA,0);// 3线,先发一位: 命令 -- 0
gpio_setvalue(SCL,1);
gpio_unexport(SDA);
gpio_unexport(SCL);
gpio_unexport(CS);
s_send(X);
gpio_exportout(CS);
gpio_setvalue(CS,1);
gpio_unexport(CS);
}
void s_data(unsigned char X) //写数据
{ gpio_exportout(CS);
gpio_exportout(SDA);
gpio_exportout(SCL);
gpio_setvalue(CS,0);
gpio_setvalue(SCL,0);
gpio_setvalue(SDA,1);// 3线,先发一位: 数据 -- 1
gpio_setvalue(SCL,1);
gpio_unexport(SDA);
gpio_unexport(SCL);
gpio_unexport(CS);
s_send(X);
gpio_exportout(CS);
gpio_setvalue(CS,1);
gpio_unexport(CS);
}
void coordinate(unsigned int col,unsigned int page)
{
s_com(0x2a); //Column Address Set
s_data(0x00);
s_data(col);
s_data(0x00);
s_data(0xef);
s_com(0x2b); //Row Address Set
s_data((page&0xff00)>>8);
s_data(page&0x00ff);
s_data(0x01);
s_data(0x3f);
s_com(0x2c); //Memory Write
}
int main(int argc ,char *argv[])
{ int fd;
void *map_base;
fd = open("/dev/mem", O_RDWR|O_SYNC);
if(fd == -1)
{ printf("Can't open /dev/mem\n");
return -1;
}
printf("open /dev/mem success\n");
int psize=getpagesize();
int rem=spi_base%psize;
int offset=spi_base-rem;
int length=spi_base+REG_SPCS-offset+1 ; //这里只需+1,spi寄存器只8位一字节
printf("pagesize:%i ; spi0 base:%x ; remainder:%i ; offset:%x ; length:%i\n",psize,spi_base,rem,offset,length);
map_base=(volatile unsigned char*)mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_SHARED,fd,offset);
if(map_base==NULL || map_base ==MAP_FAILED)
printf("Can't mmap\n");
else
printf("mmap success\n");
mapspi_base=(volatile unsigned char*)(map_base+rem);//同样spi寄存器只8位一字节,所以unsigned char*
*(volatile unsigned char*)(mapspi_base+REG_SPCS)=0xff;//取消片选CS3
/* SPCR控制寄存器
复位SPI控制寄存器工作, 0x10= 00010000 , spe为0--停止SPI
0 0 01 0000
| |
spe mstr
*/
*(volatile unsigned char*)(mapspi_base+REG_SPCR)=0x10;
*(volatile unsigned char*)(mapspi_base+REG_SPSR)=0xc0;//重置状态寄存器SPSR . 0xc0= 11000000
/* SPER外部寄存器
设置外部寄存器, 0x00= 00000000 , icnt为00--传输完1个字节后发中断,mode为0--采样与发送时机同时
00 000 0 00
| | |
icnt mode spre
*/
*(volatile unsigned char*)(mapspi_base+REG_SPER)=0x00;
/* SPCR控制寄存器
SPCR的spr位和SPER的spre位两者共同设定分频系数,分频系数越小,越快,设分频系数最小,spr(00)+spre(00)=分频系数2 ,很快,点亮整屏约0.5秒内
设置spr为00,即REG_SPCR为0xd0=11010000 ,spie为1--中断使能,spe为1--启动SPI
1 10 1 0 0 00
| | | | | \/
spiespe mstrcpolcphaspr
*/
*(volatile unsigned char*)(mapspi_base+REG_SPCR)=0xd0;
*(volatile unsigned char*)(mapspi_base+REG_SPCS)=0x7f;//设置片选CS3 0x7f= 01111111
//--v-- GPIO
int fd2;
void *map_base2;
fd2 = open("/dev/mem", O_RDWR|O_SYNC);
if(fd2 == -1)
{ printf("Can't open /dev/mem\n");
return -1;
}
printf("open /dev/mem success\n");
rem=gpio_base%psize;
offset=gpio_base-rem;
int length2=gpio_base+GPIO_OUT-offset+4; //这里要+4,GPIO寄存器32位四字节
printf("pagesize:%i ; gpio2 base:%x ; remainder:%i ; offset:%x ; length:%i\n",psize,gpio_base,rem,offset,length2);
map_base2=(volatile unsigned int*)mmap(NULL,length,PROT_READ|PROT_WRITE,MAP_SHARED,fd2,offset);
if(map_base==NULL || map_base ==MAP_FAILED)
printf("Can't mmap\n");
else
printf("mmap success\n");
mapgpio_base=(volatile unsigned int*)(map_base2+rem);
//--^--
system("echo "RST" > /sys/class/gpio/export && echo out > /sys/class/gpio/gpio"RST"/direction");
// LCD Reset
system("echo 0 > /sys/class/gpio/gpio"RST"/value");
system("echo 0 > /sys/class/gpio/gpio"RST"/value");
sleep(1);
system("echo 1 > /sys/class/gpio/gpio"RST"/value");
system("echo 1 > /sys/class/gpio/gpio"RST"/value");
sleep(1);
//--v-- ILI9341初始化开始
// 初始化部分是照抄51单片机程序.就是发送命令/数据,具体代表什么意思需参考ILI9341手册
s_com(0xCF);
s_data(0x00);
s_data(0x81);
s_data(0x30);
s_com(0xED);
s_data(0x64);
s_data(0x03);
s_data(0x12);
s_data(0x81);
s_com(0xE8);
s_data(0x85);
s_data(0x10);
s_data(0x78);
s_com(0xCB);
s_data(0x39);
s_data(0x2C);
s_data(0x00);
s_data(0x34);
s_data(0x02);
s_com(0xF7);
s_data(0x20);
s_com(0xEA);
s_data(0x00);
s_data(0x00);
s_com(0xB1);
s_data(0x00);
s_data(0x13);
s_com(0xB6);// Display Function Control
s_data(0x0A);
s_data(0xA2);
s_com(0xC0);//Power control
s_data(0x21); //VRH
s_com(0xC1);//Power control
s_data(0x11); //SAP;BT
s_com(0xC5);//VCM control
s_data(0x3F);
s_data(0x3C);
s_com(0xC7);//VCM control2
s_data(0xa4);
s_com(0x36);// Memory Access Control
s_data(0x08);
s_com(0x3A);// Pixel Format Set
s_data(0x55);
s_com(0xF2);// 3Gamma Function Disable
s_data(0x00);
s_com(0x26);//Gamma curve selected
s_data(0x01);
s_com(0xE0);//Set Gamma
s_data(0x0F);
s_data(0x26);
s_data(0x24);
s_data(0x0B);
s_data(0x0E);
s_data(0x09);
s_data(0x54);
s_data(0xA8);
s_data(0x46);
s_data(0x0C);
s_data(0x17);
s_data(0x09);
s_data(0x0F);
s_data(0x07);
s_data(0x00);
s_com(0xE1);//Set Gamma
s_data(0x00);
s_data(0x19);
s_data(0x1B);
s_data(0x04);
s_data(0x10);
s_data(0x07);
s_data(0x2A);
s_data(0x47);
s_data(0x39);
s_data(0x03);
s_data(0x06);
s_data(0x06);
s_data(0x30);
s_data(0x38);
s_data(0x0F);
s_com(0x11); //Exit Sleep
sleep(1);
s_com(0x29); //Display on
s_com(0x22);
s_data(0x00);
sleep(1);
//--^-- ILI9341初始化结束
coordinate(0,0);//窗口坐标
int i,j;
for(j=240;j>0;j--)
{ // 绿 0x07E0
for(i=320;i>0;i--)
{ s_data(0x07);
s_data(0xe0);
}
}
system("echo "RST" > /sys/class/gpio/unexport");
close(fd);
munmap((void*)map_base,length);
close(fd2);
munmap((void*)map_base2,length2);
return 0;
}
2.编译
1)环境
龙芯2F笔记本逸珑8089,debian 9,o32,dietlibc库
2)编译为静态可执行文件
loongson@debian:~$ diet gcc -static -o spilcd spilcd.c
说明:因debian 9的C标准库太新,直接gcc编译,复制到智龙主板运行提示内核太旧.所以使用了精简的C库dietlibc
3.运行
程序复制到智龙根目录下运行
#./spilcd
很快整屏填充绿色.
页:
[1]
2