龙芯俱乐部开源社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 16817|回复: 26

9341屏驱动开发过程(GUI、增加tty 裸奔版)

[复制链接]

9

主题

15

帖子

1319

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1319
发表于 2015-10-21 20:07:11 | 显示全部楼层 |阅读模式
本帖最后由 dstling 于 2016-12-30 14:49 编辑

为了让大家更好的学习这个屏的驱动,这两天对屏幕以及GUI驱动做了一些优化
继续更新20161230 (扩展板)代码在这
隐藏下,给论坛增加下人气
更新内容:
1、采用platform驱动框架,优化驱动调用结构和层次
2、优化代码,将编译过程中所有的警告信息全部排除
3、优化MCU屏的驱动代码,减少不必要函数中转调用,尤其是关乎写屏的函数代码,尽可能的提高屏的写入效率
4、去除大部分没必要的调试代码,让代码看起来更好看些
5、删除没用的测试函数
注意:测试过程参考下面的过程,相关文件路径设置没变

继续更新20160714代码在这:http://pan.baidu.com/s/1skRuFhj
更新内容(续历史内容):
1、刚有了1C的官方扩展板,将代码更新为扩展板适用版本(目前官方扩展板的管脚对MCU屏效率不是最优的,扩展板的管脚不同于我历史杜邦线管脚,扩展板管脚对MCU屏的效率比较低,因为它拆开了屏数据接口,写屏幕时需要拆分整合数据,降低了屏的写入效率)
2、更新了一个tty驱动(tty_lcd),可以脱离串口单独运行了(调试好后可以关闭串口设备),用户程序依附在tty_lcd的shell壳下,串口依然有console输出(没有问题,可以换,但是没必要)
3、在tty_lcd驱动之下实现了当前tty_lcd shell壳下的终端,也就是说,在这个终端模拟下,可以脱离串口调试运行,触摸键盘效率低下,最好不要使用vi、more、top等指令,触摸模拟键盘并没有实现相关中断切换(如ctrl+c)指令,改进键盘可以实现,假如用了就退出重新进入模拟终端吧
4、修改查看文本最好使用已经实现的电子图书和记事本应用(^_^)

调试步骤:
直接make 、insmod调试需要做下准备(按步骤来哦,说的罗嗦点,懂的自然懂):
1、在/home下新建lcd9341目录并将down下的SYSTEM整个复制到lcd9341下,即必须有相关图标文件/home/lcd9341/SYSTEM 的文件
2、将make得到的lcd9341_dri.ko内核文件下载至/home/lcd9341下
3、将用户程序编译(mipsel-linux-gcc -o lcdtest lcdtest.c)得到的lcdtest用户程序下载到/home/lcd9341下
4、增加/etc/rc.d/rc.sysinit内容 底行增加  ifconfig eth0 192.168.11.70(你的局域网ip)
5、增加/etc/rc.d/rc.sysinit内容 继续增加 /usr/sbin/telnetd (说明:4、5两部是为了防止调试失败的时候,可以打开telnet补救)
6、增加/etc/rc.d/rc.sysinit内容 继续增加 /sbin/insmod /home/lcd9341/lcd9341_dri.ko(说明:加载本例的驱动)
7、增加/etc/rc.d/rc.sysinit内容 继续增加 /home/lcd9341/lcdtest &(说明:当前壳下运行用户程序)
8、重要,增加/etc/initab内容,添加行   tty_lcd0::respawn:-/bin/sh (说明:内核启动后会自动打开这条指令的/dev/tty_lcd0设备,建立内核和本例子tty驱动的联系)
9、reboot吧

图片若干

GUI主界面

GUI主界面

模拟终端

模拟终端

文件浏览

文件浏览

图片显示

图片显示

文本阅读

文本阅读

文本修改

文本修改



20160702内容:
1.png
20160702杜邦线代码(非扩展板历史内容):http://pan.baidu.com/s/1qYN81o4
代码内容包括(基本也是我基于这个屏幕的移植学习适配过程):
1、GPIO控制(这是基础)2、驱动框架
3、ili9341屏驱动
4、5线制XPT2046芯片电阻屏驱动
5、中文字库
6、图片解码(BMP、GIF、JPG)
7、GUI基于上述硬件实现的控件
8、(着重说下)linux下目录文件的控制(这里花了很多时间,学习了VFS,dentry,以及具体的文件系统,最后还是放弃,通过用户态方法交互实现)
9、内核线程编程(虽然不完美),尽量释放内核
10、内核态、用户态交互配合(各种二者之间的通信配合,最后选择了个简单的办法)
11、最后深入了解驱动框架编程
代码中管脚文档说明较为清楚,lcdtest.c是用户态程序,
其余为驱动代码,make完insmod 然后需要修改一些图标路径,字库路径,触摸屏校准流程

直接make运行的需要做如下准备工作:
1、在/etc下新建FONT目录并将代码中down下的font下的字库文件复制到/etc/FONT下
2、在/home下新建lcd9341目录并将down下的SYSTEM整个复制到lcd9341下 即必须有相关图标文件/home/lcd9341/SYSTEM 的文件
3、校准你的触屏,会在/etc下生成触屏配置文件tft_9341_touch.cfg

记录:
移植了触摸驱动
移植了中文字库
移植了GUI(实现了窗口、按钮、滚动跳,编辑框等控件,文件浏览控件实现中 存在bug)
移植了一个记事本功能文件浏览功能移植完成
JPG GIF BMP移植完成  
去掉独占内核方式,改为线程模式,释放内核(本来就该这样,不然就失去了GUI的意义)
移植了一个记事本
增加GUI界面的触屏校准
1C反应不错,不算慢

移植了一个GUI

移植了一个GUI

实现了一个记事本

实现了一个记事本


11.png


历史内容:更新一处管脚说明:屏RST需要接在板子RESET脚
驱动源码20151025更新 http://pan.baidu.com/s/1dD16GiX
管脚说明:http://pan.baidu.com/s/1jI6iy6y
伪驱动源码 http://pan.baidu.com/s/1dDkB0o5
环境我用的人家搭好的 http://pan.baidu.com/s/1dDB5ZWH
里面有个“安装并配置好的虚拟机开发环境”vmware虚拟机,直接下载下来,环境都搞好了
我这个屏的型号是正点原子9341的屏,其他类似屏同样可以驱动

伪驱动源码里面有个yizhihanshu.c的文件,这里的代码都是以频繁读写/sys/class/gipo/里面的文件来驱动显示屏,效率极其低下,可想而知,当你向屏的数据接口写16位数据的时候,你要读写16次文件(还有N次的命令使能端口读写),而你要刷新一个屏幕时,拿65535色的屏来说,你需要读写16X65535次文件,显而易见需要极其长的时间,事实也是当刷新一次屏基本上需要半个小时

之前研究了 龙芯1B开发板-点灯大法  http://www.openloongson.org/foru ... d=20&extra=page%3D1
在这个基础上移植了这个驱动

于是尝试自己动手写个驱动,从内核的层面驱动(上面都是废话)
驱动这个屏,有四个命令端口CS RS WR RD,用的GPIO46至49,D0~D15对应GPIO64~79,之所以用这个,是为了读取写入数据的效率,因为这样直接对应 GPIO_OUT2的低16位,可以一次性操作到位


lcd9341_device.c文件主要是一些直接和内核打交道的框架函数,关于 file_operations这里我研究了1天,主要是一些接口的配置,程式化的,不必深究,.open = lcd_open,初始化驱动文件,unlocked_ioctl=lcd_ioctl操作命令,.write = lcd_write,应用程序向驱动传递数据,其他内容源码注释较为清楚了


lcd9341_fn.c文件是驱动的具体实现,以及移植了一些函数原型,之所以说是移植,需要gpio_out_mod(void)输出模式 gpio_in_mod(void)输入模式, read_data读数据 write_data写数据等一些必要的函数的支持,主要是为了配合ILI93xx.c(这个文件来自正点原子STM32驱动)


我在makefile这里浪费了很多时间,虽然makefile文件内容很少。
不得不说,linux包容的东西太多,很多地方不是很了解,但是一旦了解,就刻骨铭心,呵呵
源码有很多注释
再次感谢论坛详实(l乱七八糟)的资料
QQ图片20151022150315.png QQ图片20151021201535.png

20151025新增部分:
将驱动编译进内核,免得每次都要insmod

首先将lcd9341文件夹复制进源码drivers/下

1、修改drivers/目录内Kconfig文件
底行增加:
source "drivers/lcd9341/Kconfig"
1.png
2、修改drivers/目录内Makefile文件
底行增加:
obj-$(CONFIG_LCD9341_LS1C_DRIVER_SUPPORT) += lcd9341/
2.png
3、lcd9341文件夹内已经有了对应的makefile和kconfig文件了(关于Kconfig 和makefile的资料可以参考:http://blog.csdn.net/luobin1984/article/details/7990798)
4、虚拟环境下make menuconfig 找到
3.png
5、进去选中,一直exit,退出保存 make
6、重启1C板子,按空格,pmon行输入:
devcp tftp://192.168.xxx.xxx/vmlinux /dev/mtd0
load结束后重启
7、板子进入系统后命令行查看模块情况:
ls /dev/
4.png
说明驱动已经有了,对了 linux对于驱动都是当作一个文件(字符设备?)来管理的
8、运行测试程序(我称之为自己弄的虚拟终端*^_^* ),目前利用popen管道来测试输出,测试程序源码lcdtest.c文件地址:http://pan.baidu.com/s/1mgvmMPq
虚拟机编译下:
mipsel-linux-gcc -o lcdtest ledtest.c
将编译得到的lcdtest弄进1C板子,运行后将获得一个虚拟的终端程序,以后你所有的执行输出将在屏幕显示(cd等命令有问题,这是由于popen函数造成的),lcdtest程序为一个死循环程序,别忘记ctrl+c退出哦

大神请无视,权且当作学习笔记,我将乐此不疲O(∩_∩)O~~~~

增加中文字库

增加中文字库
2.png

48

主题

257

帖子

4920

积分

新手上路

Rank: 1

积分
4920
发表于 2015-10-22 15:18:33 | 显示全部楼层
本帖最后由 简单平安 于 2015-10-22 15:22 编辑

赞!
注释很详细。

有两处个人认为可以优化一下:
LCD_Init()放lcd_open()更合适
linux源码中已经把gpio常用的接口封装好了("arch/mips/loongson/ls1x/gpio.c"),可以直接用,在使用gpio前,先gpio_request(),可以使用platform框架。

另外,网盘中的配置好的开发环境是我的,还好用吧。

48

主题

257

帖子

4920

积分

新手上路

Rank: 1

积分
4920
发表于 2015-10-22 15:23:58 | 显示全部楼层
现在开源龙芯(个人认为)有两个好的项目:小车和3D打印机
如果感兴趣的话,可以加入。
感觉你动手能力还挺强的,也愿意投入时间,欢迎加入。

56

主题

393

帖子

43万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
438313
发表于 2015-10-25 10:14:43 | 显示全部楼层
很好啊,屏幕也点亮了 ,请问你买的这个屏幕多少钱了?

9

主题

15

帖子

1319

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1319
 楼主| 发表于 2015-10-25 16:35:50 | 显示全部楼层
sn2015ol 发表于 2015-10-25 10:14
很好啊,屏幕也点亮了 ,请问你买的这个屏幕多少钱了?

某宝几十块吧 9341屏搜下就能找到了

2

主题

7

帖子

327

积分

中级会员

Rank: 3Rank: 3

积分
327
发表于 2016-5-17 16:54:08 | 显示全部楼层
楼主,您好,我按您的方法尝试点亮lcd, 但是没有驱动成功,请问接线的话除了要接四个命令端口CS RS WR RD(GPIO46至49),和D0~D15(GPIO64~79)这二十个引脚之外还需要接哪些引脚,他们分别对应哪些GPIO?

9

主题

15

帖子

1319

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1319
 楼主| 发表于 2016-5-24 11:40:12 | 显示全部楼层
苏可培培 发表于 2016-5-17 16:54
楼主,您好,我按您的方法尝试点亮lcd, 但是没有驱动成功,请问接线的话除了要接四个命令端口CS RS WR RD ...

看帖子开头部分,增加了一个管脚说明文档,

2

主题

7

帖子

327

积分

中级会员

Rank: 3Rank: 3

积分
327
发表于 2016-5-30 18:51:23 | 显示全部楼层
本帖最后由 苏可培培 于 2016-5-30 18:53 编辑

楼主,您好,我按照您说的方法一步步进行,驱动程序我是内核启动后再单独加载进去的,加载成功(dev下有设备文件),但是当最后运行应用程序的时候发生了段错误,错误信息如下,图片格式见附件:
[root@Loongson-gz:/]#./lcdtest
LCD test...
open lcd ok!
LCD IDx:cf10
CPU 0 Unable to handle kernel paging request at virtual address 00000000, epc == c0060188, ra == c0060174
Oops[#6]:
Cpu 0
$ 0   : 00000000 3000fc00 81bfbeb0 fffff800
$ 4   : 81bfbec4 00000000 00000000 00000000
$ 8   : 81bfbeb0 804680c0 00000001 fffffff8
$12   : ffffffff 7f9d5de8 2b062c64 f0000000
$16   : 00000000 00000014 00000000 81bfbf18
$20   : 00631506 00000008 0060dbb8 004d895c
$24   : 0000000c 2b154984                  
$28   : 81bfa000 81bfbe98 7f9d5f78 c0060174
Hi    : 00000051
Lo    : 00001fac
epc   : c0060188 lcd_write+0x48/0x98 [lcd9341_dri]
    Tainted: G      D   
ra    : c0060174 lcd_write+0x34/0x98 [lcd9341_dri]
Status: 1000fc03    KERNEL EXL IE
Cause : 10800008
BadVA : 00000000
PrId  : 00004220 (Loongson LS1X)
Modules linked in: lcd9341_dri
Process lcdtest (pid: 102, threadinfo=81bfa000, task=81959b90, tls=2b07ee90)
Stack : 00000001 807b0000 00000000 00000000 81cbbd08 0000000d 00000000 00000000
        00000000 00000000 00000000 004d895c 81e34c00 802e4d9c 81cc6860 81e34c08
        81cbbd08 00000001 81e34c00 00000003 00000000 81e34c00 00000014 00000000
        00631506 802e4f6c 80202674 00000000 00000000 00000000 00000000 00631506
        00000000 00000000 00000000 00000000 00000000 8020b8cc 009ae30c 009ae324
        ...
Call Trace:
[<c0060188>] lcd_write+0x48/0x98 [lcd9341_dri]
[<802e4d9c>] vfs_write+0xbc/0x164
[<802e4f6c>] sys_write+0x50/0xcc
[<8020b8cc>] stack_done+0x20/0x40


Code: 3c02c007  a4439940  01001021
26100001  a0410000  1420fffc  24420001  2402000c
Segmentation fault

这个应该是一个驱动中的野指针的问题,请问解决这个问题我可以从哪些方向去排查?

错误信息

错误信息

9

主题

15

帖子

1319

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1319
 楼主| 发表于 2016-6-6 11:54:30 | 显示全部楼层
本帖最后由 dstling 于 2016-6-6 13:02 编辑
苏可培培 发表于 2016-5-30 18:51
楼主,您好,我按照您说的方法一步步进行,驱动程序我是内核启动后再单独加载进去的,加载成功(dev下有设 ...

这里并没有识别屏幕ID 不知道你的屏幕正确ID应该是多少,我这屏的ID 0x9341驱动中void LCD_Init(void)这个函数是对屏识别及初始化的一个过程,当屏回应代码不对时,我这驱动好像还是在运行的(由于当时我测试成功后,就没有考虑失败后的处理),当识别失败后,很有可能就会出现你说的指针错乱问题了
有时间我再恢复下我的屏

qq 107295484

QQ图片20160606123212.png

1

主题

6

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2017-2-23 13:57:57 | 显示全部楼层
顶.....................
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2021-10-16 05:30 , Processed in 10.500085 second(s), 125 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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