龙芯俱乐部开源技术社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 11211|回复: 10

请教龙芯1C智龙主板如何驱动LCD

[复制链接]

8

主题

28

帖子

1116

积分

金牌会员

Rank: 6Rank: 6

积分
1116
发表于 2015-9-2 15:31:19 | 显示全部楼层 |阅读模式
本帖最后由 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资料,是不是违反职业操守,呵呵

84

主题

465

帖子

44万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
440445
发表于 2015-9-2 22:01:08 | 显示全部楼层
过段时间会出带液晶屏的扩展板

34

主题

108

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
16630
发表于 2015-9-2 22:47:04 | 显示全部楼层
肯定要有ST7789V-G的资料吧

48

主题

257

帖子

4920

积分

新手上路

Rank: 1

积分
4920
发表于 2015-9-6 17:20:58 | 显示全部楼层
我在淘宝上的“龙芯1c开发板”里看见如下描述
  支持4.3寸和7寸LCD显示屏
  40针LCD接口引出了LCD控制器和触摸屏的全部信号
  使用4.3寸LCD,最高分辨率支持480x272
  触摸屏使用一片SPI转换芯片XPT2046
可以在淘宝上“龙芯1B开发板”,有个4.3寸lcd的开发板照片,7寸的lcd可以用群创的。

8

主题

28

帖子

1116

积分

金牌会员

Rank: 6Rank: 6

积分
1116
 楼主| 发表于 2015-10-28 09:42:11 | 显示全部楼层
本帖最后由 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也足够亮



spi.JPG

8

主题

28

帖子

1116

积分

金牌会员

Rank: 6Rank: 6

积分
1116
 楼主| 发表于 2015-10-28 09:56:16 | 显示全部楼层

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[5:0]
  s_com(0xC1);  //Power control
  s_data(0x11); //SAP[2:0];BT[3:0]
  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.运行
程序复制到智龙根目录下运行
[root@Loongson-gz:/]#./spilcd

因是操作/sys/class/gpio,极其慢,但终可驱动LCD了,可见一点一点填充绿色.

8.参考资料
https://github.com/上有很多ILI9341例子
ILI9341手册网上可搜到
<openloongson-kernel源码>的../arch/mips/loongson/ls1x/video_modes.c
本站的<初探驱动开发过程,LCD9341屏>


48

主题

257

帖子

4920

积分

新手上路

Rank: 1

积分
4920
发表于 2015-10-28 16:45:58 | 显示全部楼层
赞!

8

主题

28

帖子

1116

积分

金牌会员

Rank: 6Rank: 6

积分
1116
 楼主| 发表于 2016-3-15 10:35:27 | 显示全部楼层
上面的是模拟SPI方式.想尝试龙芯1C硬件SPI驱动LCD,<LS1C用户手册>里的SPI寄存器都是8位的.ILI9341支持4线,即8位,外加一根D/CX(数据/命令选择),但我的液晶屏没引出D/CX .所以又只能用SPI 3线,即9位(先发一位数据/命令选择).
问题是硬件SPI怎只发一位?查找网上说'每次写数据前把SPI口设置为推挽输出模式',先发该一位数据/命令的方式与模拟SPI相同,只是在发8位时用硬件SPI.我查了<LS1C用户手册>,都没有推挽输出模式的有关描述,而网上查到都是有关单片机方面的推挽输出.

请问各位龙芯1C是否有所谓的推挽输出?我也不懂什么推挽输出

10

主题

174

帖子

2789

积分

禁止发言

积分
2789
发表于 2016-4-5 13:23:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

8

主题

28

帖子

1116

积分

金牌会员

Rank: 6Rank: 6

积分
1116
 楼主| 发表于 2016-5-6 08:18:04 | 显示全部楼层
本帖最后由 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[95:64]
#define    SDA  79
#define    SCL  78
#define    CS   84

#define gpio_base 0x1FD010C8  //GPIO2--gpio组2
#define GPIO_CFG 0x00
#define GPIO_EN  0x10
#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[95:64],要减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   0  1    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     1  0    1     0     0    00
     |     |       |     |     |    \/
    spie  spe     mstr  cpol  cpha  spr
*/
  *(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[5:0]
  s_com(0xC1);  //Power control
  s_data(0x11); //SAP[2:0];BT[3:0]
  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.运行
程序复制到智龙根目录下运行
[root@Loongson-gz:/]#./spilcd
很快整屏填充绿色.

















您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|龙芯俱乐部开源技术社区

GMT+8, 2024-11-28 07:26 , Processed in 0.121513 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表