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

http://www.openloongson.org/forum.php?mod=viewthread&tid=141&extra=

为了让大家更好的学习这个屏的驱动,这两天对屏幕以及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吧

 

图片若干

 


20160702内容:
 
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反应不错,不算慢

 

 


历史内容:更新一处管脚说明:屏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乱七八糟)的资料
 

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

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

1、修改drivers/目录内Kconfig文件
底行增加:
source "drivers/lcd9341/Kconfig"
 
2、修改drivers/目录内Makefile文件
底行增加:
obj-$(CONFIG_LCD9341_LS1C_DRIVER_SUPPORT) += lcd9341/
 
3、lcd9341文件夹内已经有了对应的makefile和kconfig文件了(关于Kconfig 和makefile的资料可以参考:http://blog.csdn.net/luobin1984/article/details/7990798)
4、虚拟环境下make menuconfig 找到
 
5、进去选中,一直exit,退出保存 make
6、重启1C板子,按空格,pmon行输入:
devcp tftp://192.168.xxx.xxx/vmlinux /dev/mtd0
load结束后重启
7、板子进入系统后命令行查看模块情况:
ls /dev/
 
说明驱动已经有了,对了 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~~~~
 

3.jpg (1.91 MB, 下载次数: 2)

增加中文字库

增加中文字库

2.png (236.87 KB, 下载次数: 1)

 

2.png

1.png

附:龙芯Intellij IDEA开发Spring web应用视频 

http://tieba.baidu.com/p/5975179608

猜你喜欢

转载自blog.csdn.net/weixin_40065369/article/details/86687202