Home

cubie.cc CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 601|回复: 1

CB6 移植 CubieScreen 笔记

[复制链接]

37

主题

4

好友

1万

积分

超级版主

Rank: 8Rank: 8

贡献
2710
金钱
6209
威望
2710
买家信用
卖家信用
积分
14883
发表于 2017-4-15 16:15:06 |显示全部楼层
本帖最后由 @allen 于 2017-5-8 12:01 编辑


CubieScreen有LCD和TP 模块
所以需要调试的也这两块



一. LCD
1. 配置参数
主要是在dts 中设置输出信号为LCD,上电和复位GPIO,分辨率,时钟频率等
  1. lcd0: lcd0@b02a0000 {
  2.                 status = "okay";
  3.                 pinctrl-names = "default";
  4.                 pinctrl-0 = <&rgb_state_default>;
  5.                 lcd_power_gpios = <&gpio 130 0>;
  6.                 lcd_reset_gpios = <&gpio 131 0>;
  7.                 lcd_spi_csx = <&gpio 73 0>;
  8.                 lcd_spi_sck = <&gpio 72 0>;
  9.                 lcd_spi_sdi = <&gpio 71 0>;
  10.                 port_type = "rgb";
  11.                 data_width = <0>;
  12.                 videomode-0 = <&lcd_mode0>;
  13.                 vsync_inversion = <0>;
  14.                 hsync_inversion = <0>;
  15.                 dclk_inversion = <0>;
  16.                 lde_inversion = <0>;
  17.                 lvds_ctl = <0x000a9521>;
  18.                 lvds_alg_ctl0 = <0xc141a030>;
  19.                 lightness = <125>;
  20.                 saturation = <7>;
  21.                 contrast = <7>;
  22.                 lcd_mode0:mode@800x480p60 {
  23. refresh = <60>;
  24.                         xres = <800>;
  25.                         yres = <480>;
  26.                         /*in pico second, 0.000 000 000 001s*/
  27.                         pixclock = <37037>;
  28.                         left_margin = <50>;
  29.                         right_margin = <50>;
  30.                         upper_margin = <3>;
  31.                         lower_margin = <3>;
  32.                         hsync_len = <20>;
  33.                         vsync_len = <2>;
  34.                         /*0: FB_VMODE_NONINTERLACED, 1:FB_VMODE_INTERLACED*/
  35.                         vmode = <0>;
  36.                 };
  37.         };
复制代码
调屏一般都是


二. 在LCD 驱动中添加必要的初始化数据.

1.屏的数据接口是SPI.
在CB2的驱动代码中,因为A20的SPI驱动不支持发送9bit 的数据.所以驱动使用GPIO 来模拟SPI来发送.
CB2的修改请参考这里 :https://github.com/cubieboard/li ... 798c0bb342323d971db

移植到CB6的话,大部分上面的改动能直接使用,不用修改,如构建的9bit spi 发送函数 void spi_9bit_wire 和发送的初始化数据,
  1. void spi_9bit_wire(__u32 tx)
  2. {
  3.         __u8 i;

  4.         spi_csx_set(0);

  5.         for(i=0;i<9;i++)
  6.         {
  7.                 LCD_delay_us(1);
  8.                 spi_sck_set(0);
  9.                 LCD_delay_us(1);
  10.                 if(tx & (1 << 8))
  11.                         spi_sdi_set(1);
  12.                 else
  13.                         spi_sdi_set(0);
  14.                 LCD_delay_us(1);
  15.                 spi_sck_set(1);
  16.                 LCD_delay_us(1);
  17.                 tx <<= 1;
  18.         }
  19.         spi_sck_set(0);
  20.         LCD_delay_us(1);
  21.         spi_csx_set(1);
  22.         LCD_delay_us(1);
  23. }
复制代码
  1.       //Hardware pin reset
  2.         lcd_rst_set(0);
  3.         LCD_delay_ms(1);
  4.         lcd_rst_set(1);
  5.         LCD_delay_ms(1);


  6.         //software reset
  7.         printk("%s, begin send init data for CubieScreen \n",__func__);
  8.         spi_9bit_wire(0x001);
  9.         LCD_delay_ms(120);

  10.         //VGH/VGL Setting
  11.         spi_9bit_wire(0x0C1);
  12.         spi_9bit_wire(0x1A8);
  13.         spi_9bit_wire(0x1B1);
  14.         spi_9bit_wire(0x145);
  15.         spi_9bit_wire(0x104);

  16.         //VCOMDC
  17.         spi_9bit_wire(0x0C5);
  18.         spi_9bit_wire(0x180);
  19.         spi_9bit_wire(0x168);



  20. ....
复制代码
关键就是怎么将void spi_9bit_wire 函数实现了.其实也就很简单,就是GPIO的获取,申请,设置.在driver/video/owl/displays/lcdc/lcdchw.c  代码贴出来排版很难看直接给附件 ,改动如下:



同时,我在dts 里面定义了用到的几个GPIO,驱动会读出dts 的参数,从而做GPIO操作:
  1.         lcd0: lcd0@b02a0000 {
  2.                 status = "okay";
  3.                 pinctrl-names = "default";
  4.                 pinctrl-0 = <&rgb_state_default>;
  5.                 lcd_power_gpios = <&gpio 130 0>;
  6.                 lcd_reset_gpios = <&gpio 131 0>;
  7.                 <font color="Red">lcd_spi_csx = <&gpio 73 0>;
  8.                 lcd_spi_sck = <&gpio 72 0>;
  9.                 lcd_spi_sdi = <&gpio 71 0>;</font>
  10.                 port_type = "rgb";
  11.                 data_width = <0>;
复制代码
分别是GPIOC7 ,GPIOC8,GPIOC9.
计算方式是:M = 32*N +L      , GPIOA 组,N=0,GPIOB 组,N=1,GPIOC 组,N=2.
所以 GPIOC7  =71 = 32x2 +7  





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册


  • data/attachment/forum/201704/15/161345w2rg1ul16p1t9mii.zip
  • data/attachment/forum/201705/06/174853tsujxtskkslto891.png

回复

使用道具 举报

37

主题

4

好友

1万

积分

超级版主

Rank: 8Rank: 8

贡献
2710
金钱
6209
威望
2710
买家信用
卖家信用
积分
14883
发表于 2017-4-17 09:42:07 |显示全部楼层
本帖最后由 @allen 于 2017-5-8 17:36 编辑

TP触摸调试

完整的工作流程如下:主控上电后,按照 TP 规格定义的上电时序给 TP 的power 和 reset 脚上电,当触摸 TP 后,TP 通过中断线产生中断,在中断处理(后半部)中,主控通过 i2c 接口与 TP 的 ic 通讯,读取点的坐标值并分析出键值,然后上报 input 子系统。

1. 上电测试

一般调试的话,可以先不加载驱动,手动上电,使用i2c-tools 的工具去扫i2c设备和读数据出来

通过查看原理图可知,LCD与TP供电源一样的,所以给LCD上电,就同时给TP上电了。
所以在LCD能显示的情况下,不用再给TP上电,直接使用工具测试
CubieScreen 是接到i2c1 且地址为 0x5c
  1. root@cubieboard6:~# i2cdetect -y 1                                             
复制代码
  1. root@cubieboard6:~# i2cdump -y 1 0x5c                                          
  2. No size specified (using byte-data access)                                      
  3.      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef         
  4. 00: 00 0f 00 07 00 03 00 0c 00 00 00 06 00 00 00 04    .?.?.?.?...?...?         
  5. 10: 00 07 00 02 00 0c 00 02 00 11 00 10 00 06 00 10    .?.?.?.?.?.?.?.?         
  6. 20: 00 10 00 12 00 08 00 04 00 08 00 0c 00 00 00 e0    .?.?.?.?.?.?...?         
  7. 30: e0 00 01 04 04 3c 53 78 78 00 01 00 00 0c 14 00    ?.???<Sxx.?..??.         
  8. 40: 00 00 00 00 00 00 00 00 00 32 3c 7e 1b 00 00 00    .........2<~?...         
  9. 50: 00 00 00 00 00 00 00 00 00 00 00 00 78 00 8c 00    ............x.?.         
  10. 60: 00 00 00 00 00 00 00 64 64 00 00 00 00 00 0c 05    .......dd.....??         
  11. 70: a0 01 02 00 00 00 00 00 00 11 23 50 13 01 00 00    ???......?#P??..         
  12. 80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX         
  13. 90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX         
  14. a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX         
  15. b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX         
  16. c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX         
  17. d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX         
  18. e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX         
  19. f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
复制代码
能扫到,能读到,证明TP工作,可以开始移植驱动。


2. 驱动移植

拿到驱动不管怎么样,先编译成模块加载进去看看

TP 驱动直接拿A20上面的来用,虽然是3.4 的驱动,但问题不大
https://github.com/cubieboard/cu ... drivers/touchscreen
放置路径:
include/linux/ctp.h
drivers/input/touchscreen/FT5406/ft5x06.c
drivers/input/touchscreen/FT5406/ft5x06.h
在Makefile添加如下一行:
obj-m            += ft5x_ts.o

编译,发现少了mach/system.h ,而且使用__devexit_p 编译不通过。
关于__devexit_p 解释:http://blog.sina.com.cn/s/blog_ba08e8e00101caig.html
http://www.tinylab.org/fixup-compile-error-with-devinit-devexit/

修改ft5x06.c,如下,编译通过
  1. --- a/ft5x_ts.c
  2. +++ b/ft5x_ts.c
  3. @@ -42,7 +42,7 @@
  4. #include <asm/uaccess.h>

  5. #include <mach/irqs.h>
  6. -#include <mach/system.h>
  7. +//#include <mach/system.h>
  8. #include <mach/hardware.h>
  9. #include <mach/gpio.h>
  10. #include <linux/ctp.h>
  11. @@ -1516,9 +1516,8 @@ static int ft5x_ts_probe(struct i2c_client *client, const struct i2c_device_id *
  12.                     s_ft5x_ts = ft5x_ts;
  13.            queue_delayed_work(ft5x_ts->ts_workqueue, &ft5x_ts->pen_event_work, CTP_CHECK_DELAY);
  14.         #endif
  15. -       dprintk(DEBUG_INIT,"reg clk: 0x%08x\n", readl(0xf1c20a18));
  16. +       //dprintk(DEBUG_INIT,"reg clk: 0x%08x\n", readl(0xf1c20a18));

  17. -      
  18.         i2c_dev = get_free_i2c_dev(client->adapter);   
  19.         if (IS_ERR(i2c_dev)){   
  20.                 err = PTR_ERR(i2c_dev);
  21. @@ -1555,7 +1554,7 @@ exit_check_functionality_failed:
  22.         return err;
  23. }

  24. -static int __devexit ft5x_ts_remove(struct i2c_client *client)
  25. +static int ft5x_ts_remove(struct i2c_client *client)
  26. {

  27.         struct ft5x_ts_data *ft5x_ts = i2c_get_clientdata(client);
  28. @@ -1591,7 +1590,7 @@ MODULE_DEVICE_TABLE(i2c, ft5x_ts_id);
  29. static struct i2c_driver ft5x_ts_driver = {
  30.         .class          = I2C_CLASS_HWMON,
  31.         .probe          = ft5x_ts_probe,
  32. -       .remove         = __devexit_p(ft5x_ts_remove),
  33. +       .remove         = ft5x_ts_remove,
  34.         .id_table       = ft5x_ts_id,
  35.         .suspend        = ft5x_ts_suspend,
  36.         .resume         = ft5x_ts_resume,
复制代码
将模块文件放入系统里面加载,就能触摸了。

为什么改这么点就能用起来?
查看源码,发现它是使用工作队列间隔地上传坐标的,而不是一般常见的中断上传,所以也没有GPIO中断申请。而上电部分就如之前说的,不需要再操作。I2C用的总线是一样的都是i2c-1 ,使用标准的函数读写。所以这个驱动移植全志3.4到炬力3.10内核,工作很少。

3. 灵敏优化

在驱动中有初始化TP寄存器的内容:

  1. ft5x_set_reg(103,100);//int enable,low,indicate mode
  2. ft5x_set_reg(104,100);//int enable,low,indicate mode
复制代码
查看A035VL01 V0_SPEC.pdf 的31 页
地址103和104分别X与Y灵敏度设置。现在设置为100,0是最灵敏,255 不灵敏
TP 驱动移植好后,再根据实际使用,调整下灵敏度





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

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

QQ|Archiver|手机版|邮件群发|cubie.cc---深刻的嵌入式技术和应用讨论中文社区 ( 粤ICP备13051116号-1  

GMT+8, 2017-10-19 17:12 , Processed in 0.022999 second(s), 9 queries , Apc On.

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc. | Style by Coxxs

回顶部