0.前言 由于之前我们已经适配过rgb屏,如果我们去适配了4寸mipi屏,那么rgb屏就不能使用了。对于4寸屏购买链接为:
百问网4寸mipi屏
lcd_调试指南:https://tina.100ask.net/sdkmodule/linux_lcd_developmentguide-01/
display_开发指南:https://tina.100ask.net/sdkmodule/linux_display_developmentguide-01/
4寸屏适配资源包:https://forums.100ask.net/uploads/short-url/g7bq0fpssnkhsptr2qmjipwnwno.zip。该资源包里面包含了适配修改后的所有文件(包括驱动程序、设备树和配置文件等)
1.添加新驱动 将驱动程序添加到
内核的lcd驱动目录下:
tina-v853-open/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd
uboot的lcd驱动目录下:
tina-v853-open/brandy/brandy-2.0/u-boot-2018/drivers/video/sunxi/disp2/disp/lcd/
由于uboot和内核中的屏驱动会存在一些差别,下面分别展示出uboot和内核中不同的屏驱动。具体源文件可以在4寸屏适配资源包中查看。
1.1 uboot驱动程序 驱动程序头文件tft08006.h
#ifndef _tft08006_h#define _tft08006_h#include panels.hextern __lcd_panel_t tft08006_panel;extern s32 bsp_disp_get_panel_info(u32 screen_id, disp_panel_para *info);#endif /*end of file*/ 驱动程序的c文件tft08006.c
这里只展示与内核不同的部分
__lcd_panel_t tft08006_panel = { /* panel driver name, must mach the name of * lcd_drv_name in sys_config.fex */ .name = tft08006, .func = { .cfg_panel_info = lcd_cfg_panel_info, .cfg_open_flow = lcd_open_flow, .cfg_close_flow = lcd_close_flow, .lcd_user_defined_func = lcd_user_defined_func, },}; 1.2 内核驱动程序 驱动程序头文件tft08006.h
#ifndef _tft08006_h#define _tft08006_h#include panels.hextern struct __lcd_panel tft08006_panel;extern s32 bsp_disp_get_panel_info(u32 screen_id, struct disp_panel_para *info);#endif /*end of file*/ 驱动程序的c文件tft08006.c,这里只展示与uboot不同的部分。
struct __lcd_panel tft08006_panel = { /* panel driver name, must mach the name of * lcd_drv_name in sys_config.fex */ .name = tft08006, .func = { .cfg_panel_info = lcd_cfg_panel_info, .cfg_open_flow = lcd_open_flow, .cfg_close_flow = lcd_close_flow, .lcd_user_defined_func = lcd_user_defined_func, },}; 2.修改内核中panels.h和panels.c 由于内核中没有对tft08006屏驱动有相关的配置,所以我们还需要在panels全志显示驱动中增加定义。
2.1 修改内核中panels.h 在屏驱动目录下修改panels.h
book@100ask:~/workspaces/tina-v853-open/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd$ vi panels.h 在icn6202屏驱动定义的后面增加tft08006屏驱动定义
#ifdef config_lcd_support_icn6202extern struct __lcd_panel icn6202_panel;#endif#ifdef config_lcd_support_icn6202extern struct __lcd_panel icn6202_panel;#endif#ifdef config_lcd_support_nt35510_mipiextern struct __lcd_panel nt35510_panel;#endif 按下esc,输入:wq,保存刚才的修改并退出
2.2 修改内核中panels.c 在屏驱动目录下修改panels.c
book@100ask:~/workspaces/tina-v853-open/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd$ vi panels.c 在icn6202屏驱动定义的后面增加tft08006屏驱动定义
#ifdef config_lcd_support_icn6202 &icn6202_panel,#endif#ifdef config_lcd_support_tft08006 &tft08006_panel,#endif#ifdef config_lcd_support_nt35510_mipi &nt35510_panel,#endif 按下esc,输入:wq,保存刚才的修改并退出
3.修改内核中kconfig和makefile 3.1 修改内核中的kconfig 修改屏驱动目录下的kconfig,使内核配置中增加tft08006屏驱动的,以便后续选择编译该屏驱动
在屏驱动目录下输入vi kconfig
tina-v853-open/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd$ vi kconfig 在icn6202屏驱动配置的后面增加tft08006屏驱动配置
config lcd_support_icn6202 bool lcd support icn6202 panel default n ---help--- if you want to support icn6202 panel for display driver, select it.config lcd_support_tft08006 bool lcd support tft08006 panel default n ---help--- if you want to support tft08006 panel for display driver, select it.config lcd_support_nt35510_mipi bool lcd support nt35510_mipi panel default n help if you want to support nt35510_mipi panel for display driver, select it. 按下esc,输入:wq,保存刚才的修改并退出
3.2 修改内核中的makefile 返回屏驱动的上一级目录,修改makefile文件
book@100ask:~/workspaces/tina-v853-open/kernel/linux-4.9/drivers/video/fbdev/sunxi/disp2/disp$ vi makefile 在icn6202屏驱动编译规则的后面增加tft08006屏驱动编译规则
disp-$(config_lcd_support_icn6202) += lcd/icn6202.odisp-$(config_lcd_support_tft08006) += lcd/tft08006.odisp-$(config_lcd_support_nt35510_mipi) += lcd/nt35510.o 按下esc,输入:wq,保存刚才的修改并退出
4.修改内核配置 在tina的根目录下输入make kernel_menuconfig,进入内核配置界面。
book@100ask:~/workspaces/tina-v853-open$ make kernel_menuconfig 在选中屏驱动前,要确保disp driver support(sunxi-disp2) ,我们的提供的sdk默认已经打开了,如果您之前关闭了,需要在内核配置界面中,进入video support for sunxi目录下输入y选中sunxi-disp2打开lcd节点配置。
→ device drivers → graphics support → frame buffer devices → video support for sunxi disp driver support(sunxi-disp2) 进入屏驱动目录,输入y选中tft08006
→ device drivers → graphics support → frame buffer devices → video support for sunxi → lcd panels select [*] lcd support tft08006 panel 如下图所示,选中tft08006屏驱动,编译到内核中。
保存并推车内核配置界面。
5.修改uboot配置 进入uboot的根目录下,执行make menuconfig,打开uboot配置界面。
book@100ask:~/workspaces/tina-v853-open/brandy/brandy-2.0/u-boot-2018$ make menuconfig 在选中屏驱动前,要确保disp driver support(sunxi-disp2) ,我们的提供的sdk默认已经打开了,如果您之前关闭了,需要在内核配置界面中,进入graphics support目录下输入y选中sunxi-disp2打开lcd节点配置。
→ device drivers → graphics support [*] disp driver support(sunxi-disp2) ---> 进入屏驱动目录下,输入y选中tft08006屏驱动。
→ device drivers → graphics support → lcd panels select [*] lcd support tft08006 panel 如下图所示,选中tft08006屏驱动。
保存并退出uboot配置界面
6.修改设备树 设备树位置:tina-v853-open/device/config/chips/v853/configs/100ask/
book@100ask:~/workspaces/tina-v853-open/device/config/chips/v853/configs/100ask$ lsboardconfig.mk board.dts buildroot env.cfg linux-4.9 sys_config.fex uboot-board.dts 其中board.dts为内核设备树,uboot-board.dts为uboot设备树。
6.1 修改uboot设备树 在设备树的目录下输入vi uboot-board.dts,编译uboot设备树。
book@100ask:~/workspaces/tina-v853-open/device/config/chips/v853/configs/100ask$ vi uboot-board.dts 注释掉原来的lcd0节点,修改tft08006屏lcd0节点
&lcd0 { base_config_start = ; lcd_used = ; lcd_driver_name = tft08006; lcd_backlight = ; lcd_if = ; lcd_x = ; lcd_y = ; lcd_width = ; lcd_height = ; lcd_dclk_freq = ; lcd_pwm_used = ; lcd_pwm_ch = ; lcd_pwm_freq = ; lcd_pwm_pol = ; lcd_pwm_max_limit = ; lcd_hbp = ; lcd_ht = ; lcd_hspw = ; lcd_vbp = ; lcd_vt = ; lcd_vspw = ; lcd_dsi_if = ; lcd_dsi_lane = ; lcd_dsi_format = ; lcd_dsi_te = ; lcd_dsi_eotp = ; lcd_frm = ; lcd_io_phase = ; lcd_hv_clk_phase = ; lcd_hv_sync_polarity= ; lcd_gamma_en = ; lcd_bright_curve_en = ; lcd_cmap_en = ; lcdgamma4iep = ; lcd_gpio_0 = ; pinctrl-0 = ; pinctrl-1 = ; base_config_end = ;}; 在&pio节点后增加复用引脚
dsi4lane_pins_a: dsi4lane@0 { allwinner,pins = pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd9, pd10, pd11; allwinner,pname = pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd9, pd10, pd11; allwinner,function = dsi; allwinner,muxsel = ; allwinner,drive = ; allwinner,pull = ; }; dsi4lane_pins_b: dsi4lane@1 { allwinner,pins = pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd9, pd10, pd11; allwinner,pname = pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd9, pd10, dp11; allwinner,function = io_disabled; allwinner,muxsel = ; allwinner,drive = ; allwinner,pull = ; }; 6.2 修改内核设备树 在设备树的目录下输入vi board.dts,编译内核设备树。
book@100ask:~/workspaces/tina-v853-open/device/config/chips/v853/configs/100ask$ vi board.dts 注释掉原来的lcd0节点,修改tft08006屏lcd0节点
&lcd0 { base_config_start = ; lcd_used = ; lcd_driver_name = tft08006; lcd_backlight = ; lcd_if = ; lcd_x = ; lcd_y = ; lcd_width = ; lcd_height = ; lcd_dclk_freq = ; lcd_pwm_used = ; lcd_pwm_ch = ; lcd_pwm_freq = ; lcd_pwm_pol = ; lcd_pwm_max_limit = ; lcd_hbp = ; lcd_ht = ; lcd_hspw = ; lcd_vbp = ; lcd_vt = ; lcd_vspw = ; lcd_dsi_if = ; lcd_dsi_lane = ; lcd_dsi_format = ; lcd_dsi_te = ; lcd_dsi_eotp = ; lcd_frm = ; lcd_io_phase = ; lcd_hv_clk_phase = ; lcd_hv_sync_polarity= ; lcd_gamma_en = ; lcd_bright_curve_en = ; lcd_cmap_en = ; lcdgamma4iep = ; lcd_gpio_0 = ; pinctrl-0 = ; pinctrl-1 = ; base_config_end = ;}; 在&pio节点后增加复用引脚
dsi4lane_pins_a: dsi4lane@0 { allwinner,pins = pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd9, pd10, pd11; allwinner,pname = pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd9, pd10, pd11; allwinner,function = dsi; allwinner,muxsel = ; allwinner,drive = ; allwinner,pull = ; }; dsi4lane_pins_b: dsi4lane@1 { allwinner,pins = pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd9, pd10, pd11; allwinner,pname = pd1, pd2, pd3, pd4, pd5, pd6, pd7, pd9, pd10, dp11; allwinner,function = io_disabled; allwinner,muxsel = ; allwinner,drive = ; allwinner,pull = ; }; 7.增加i2c触摸 通过拿到的屏幕资料包,我们可以知道该mipi屏的触摸芯片为ft5336,下面我们使用全志已经内置好的ft6336触摸驱动。
7.1 修改设备树 修改twi2节点,使用ft6336驱动,修改触摸的范围。宽x为480,高y为800。其中初始化引脚需要查看v853底板原理图,其中初始化引脚为ph7,唤醒引脚为ph8。
&twi2 { ctp@38 { status = okay; ctp_used = ; ctp_name = ft6336; ctp_twi_id = ; ctp_twi_addr = ; ctp_screen_max_x = ; ctp_screen_max_y = ; ctp_revert_x_flag = ; ctp_revert_y_flag = ; ctp_exchange_x_y_flag = ; ctp_int_port = ; ctp_wakeup = ; };}; 对于设备树的参数意义,可以访问百问网的tina站点:https://tina.100ask.net/sdkmodule/linux_deploy_developmentguide-02/#39
7.2 修改内核配置 由于我们之前适配过了rgb屏触摸驱动,所以需要进入内核中修改为我们使用的新驱动,进入如下目录中,按下空格键取消勾选之前的触摸驱动gt9xxnew touchscreen driver,输入y选中我们使用的ft6336 touchscreen driver新驱动,并保存退出。
→ device drivers → input device support → touchscreens ft6336 touchscreen driver 7.3 修改驱动程序 修改ft6336.c触摸驱动程序,这里只展示修改的部分,源文件可见4寸屏适配资源包中查看。
input_report_abs(ts->input_dev, abs_mt_position_x, -(event->au16_x[i]-480)); input_report_abs(ts->input_dev, abs_mt_position_y, -(event->au16_y[i]-800)); 7.4 lvgl绑定新触摸节点 由于tina使用的默认绑定的触摸节点为/dev/input/event0,我们需要修改lvgl驱动头文件中绑定的节点为我们触摸驱动上报数据的节点,我们触摸驱动上报的节点为event2,所以需要进入
tina-v853-open/platform/thirdparty/gui/lvgl-8/lv_examples/src目录下修改lv_drv_conf.h头文件,如下所示
book@100ask:~/workspaces/tina-v853-open$ cd platform/thirdparty/gui/lvgl-8/lv_examples/src/book@100ask:~/workspaces/tina-v853-open/platform/thirdparty/gui/lvgl-8/lv_examples/src$ vi lv_drv_conf.h 找到触摸节点中的libinput_name,将原来的/dev/input/event0修改/dev/input/event2,如下图红框内所示。
注意:我们这里修改的是头文件,可能之前编译生成过了之后再重新编译时可能不会再编译头文件,导致修改的节点不会生效,可以手动删除out目录中的lv_examples示例程序或者直接删除out目录重新编译即可。具体原因可以观看韦东山老师的《arm架构与编程》课程中的gcc编译过程详解。访问链接为:arm架构与编程
8.编译系统并打包生成镜像 返回tina根目录下,输入make,编译系统
book@100ask:~/workspaces/tina-v853-open$ make -j4...sun8iw21p1 compile kernel successfulinfo: ----------------------------------------info: build tina ok.info: ---------------------------------------- 打包生成镜像,输入pack
book@100ask:~/workspaces/tina-v853-open$ pack...dragon execute image.cfg success !----------image is at----------33m /home/book/workspaces/tina-v853-open/out/v853/100ask/openwrt/v853_linux_100ask_uart0.imgpack finish 9.烧录并测试 打包完成后,将新生成的镜像拷贝到windows主机电脑上,使用全志phoenixsuit烧写工具,烧写到开发板上。具体可以参考:https://forums.100ask.net/t/topic/2882。烧写完成后需要断电,才能连接mipi屏的排线到mipi屏接口,注意排线的线序是否一致。
接完排线后,重新接入电源,和2条type-c数据线,再将开关拨向电源接口处上电启动,启动时会出现tina linux小企鹅logo,进入系统后,可以查看触摸节点
root@tinalinux:/# ls /dev/input/event0 event1 event2 我们使用的event2,如果你不确定您的触摸驱动程序使用的是哪个,可以通过cat /dev/input/event*,其中*表示要查看的是哪一个触摸节点,例如我使用的是event2,则需要输入cat /dev/input/event2,此时触摸屏幕会有上报信息。
使用lvgl demo示例,输入lv_examples 0启动lvgl示例,可以通过点击屏幕上的ui交互按钮测试触摸是否生效。
root@tinalinux:/# lv_examples 0wh=480x800, vwh=480x1600, bpp=32, rotated=0turn on double buffering.turn on 2d hardware acceleration.turn on 2d hardware acceleration rotate.
中国移动正式推出了全球通焕新活动
下代iPad技术猜想:A8X处理器,指纹识别,NFC上榜
丹麦的研究人员开发了一种新的AI算法
智能机器人的出现 给医疗行业带来了静悄悄的变革
便携式设备中PMU的集成化
4.100ASK_V853-PRO开发板支持4寸MIPI屏
LED点阵显示器原理及程序
面对人工智能这个大潮 码农应该作何反应呢
音量控制器如何设置_音量控制器的作用
区块链在制造业中的潜力有哪些?
AI时代下,被边缘化的门禁未来其功能会异常强大
iphone设置短信铃声
资源池后端存储服务状态异常的问题处理
远景达LV4500R二维码扫码模组有哪些嵌入式应用?
大量算法工程师会很快被他们每天研究的算法所代替
结合实际案例分析的2018人工智能趋势展望
电气原理图符号大全
研华AIMB-587助力通过医学图像存储与传输系统(PACS)进行精确诊断
Avago推出了一款新型亮度传感器APDS-9004可以延长LCD屏幕的使用寿命
浅谈环绕音效系统