龙芯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.****.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)
附:龙芯Intellij IDEA开发Spring web应用视频
http://tieba.baidu.com/p/5975179608