CB6 移植 CubieScreen 笔记
本帖最后由 @allen 于 2018-2-7 18:05 编辑CubieScreen有LCD和TP 模块
所以需要调试的也这两块
一. LCD
1. 配置参数
主要是在dts 中设置输出信号为LCD,上电和复位GPIO,分辨率,时钟频率等 lcd0: lcd0@b02a0000 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&rgb_state_default>;
lcd_power_gpios = <&gpio 130 0>;
lcd_reset_gpios = <&gpio 131 0>;
lcd_spi_csx = <&gpio 73 0>;
lcd_spi_sck = <&gpio 72 0>;
lcd_spi_sdi = <&gpio 71 0>;
port_type = "rgb";
data_width = <0>;
videomode-0 = <&lcd_mode0>;
vsync_inversion = <0>;
hsync_inversion = <0>;
dclk_inversion = <0>;
lde_inversion = <0>;
lvds_ctl = <0x000a9521>;
lvds_alg_ctl0 = <0xc141a030>;
lightness = <125>;
saturation = <7>;
contrast = <7>;
lcd_mode0:mode@800x480p60 {
refresh = <60>;
xres = <800>;
yres = <480>;
/*in pico second, 0.000 000 000 001s*/
pixclock = <37037>;
left_margin = <50>;
right_margin = <50>;
upper_margin = <3>;
lower_margin = <3>;
hsync_len = <20>;
vsync_len = <2>;
/*0: FB_VMODE_NONINTERLACED, 1:FB_VMODE_INTERLACED*/
vmode = <0>;
};
};调屏一般都是
二. 在LCD 驱动中添加必要的初始化数据.
1.屏的数据接口是SPI.
在CB2的驱动代码中,因为A20的SPI驱动不支持发送9bit 的数据.所以驱动使用GPIO 来模拟SPI来发送.
CB2的修改请参考这里 :https://github.com/cubieboard/li ... 798c0bb342323d971db
移植到CB6的话,大部分上面的改动能直接使用,不用修改,如构建的9bit spi 发送函数 void spi_9bit_wire 和发送的初始化数据,void spi_9bit_wire(__u32 tx)
{
__u8 i;
spi_csx_set(0);
for(i=0;i<9;i++)
{
LCD_delay_us(1);
spi_sck_set(0);
LCD_delay_us(1);
if(tx & (1 << 8))
spi_sdi_set(1);
else
spi_sdi_set(0);
LCD_delay_us(1);
spi_sck_set(1);
LCD_delay_us(1);
tx <<= 1;
}
spi_sck_set(0);
LCD_delay_us(1);
spi_csx_set(1);
LCD_delay_us(1);
}
//Hardware pin reset
lcd_rst_set(0);
LCD_delay_ms(1);
lcd_rst_set(1);
LCD_delay_ms(1);
//software reset
printk("%s, begin send init data for CubieScreen \n",__func__);
spi_9bit_wire(0x001);
LCD_delay_ms(120);
//VGH/VGL Setting
spi_9bit_wire(0x0C1);
spi_9bit_wire(0x1A8);
spi_9bit_wire(0x1B1);
spi_9bit_wire(0x145);
spi_9bit_wire(0x104);
//VCOMDC
spi_9bit_wire(0x0C5);
spi_9bit_wire(0x180);
spi_9bit_wire(0x168);
....
关键就是怎么将void spi_9bit_wire 函数实现了.其实也就很简单,就是GPIO的获取,申请,设置.在driver/video/owl/displays/lcdc/lcdchw.c代码贴出来排版很难看直接给附件 ,改动如下:
同时,我在dts 里面定义了用到的几个GPIO,驱动会读出dts 的参数,从而做GPIO操作: lcd0: lcd0@b02a0000 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&rgb_state_default>;
lcd_power_gpios = <&gpio 130 0>;
lcd_reset_gpios = <&gpio 131 0>;
lcd_spi_csx = <&gpio 73 0>;
lcd_spi_sck = <&gpio 72 0>;
lcd_spi_sdi = <&gpio 71 0>
port_type = "rgb";
data_width = <0>;
分别是GPIOC7 ,GPIOC8,GPIOC9.
计算方式是:M = 32*N +L , GPIOA 组,N=0,GPIOB 组,N=1,GPIOC 组,N=2.
所以 GPIOC7=71 = 32x2 +7
本帖最后由 @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 且地址为 0x5croot@cubieboard6:~# i2cdetect -y 1 root@cubieboard6:~# i2cdump -y 1 0x5c
No size specified (using byte-data access)
0123456789abcdef 0123456789abcdef
00: 00 0f 00 07 00 03 00 0c 00 00 00 06 00 00 00 04 .?.?.?.?...?...?
10: 00 07 00 02 00 0c 00 02 00 11 00 10 00 06 00 10 .?.?.?.?.?.?.?.?
20: 00 10 00 12 00 08 00 04 00 08 00 0c 00 00 00 e0 .?.?.?.?.?.?...?
30: e0 00 01 04 04 3c 53 78 78 00 01 00 00 0c 14 00 ?.???<Sxx.?..??.
40: 00 00 00 00 00 00 00 00 00 32 3c 7e 1b 00 00 00 .........2<~?...
50: 00 00 00 00 00 00 00 00 00 00 00 00 78 00 8c 00 ............x.?.
60: 00 00 00 00 00 00 00 64 64 00 00 00 00 00 0c 05 .......dd.....??
70: a0 01 02 00 00 00 00 00 00 11 23 50 13 01 00 00 ???......?#P??..
80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XXXXXXXXXXXXXXXX
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,如下,编译通过--- a/ft5x_ts.c
+++ b/ft5x_ts.c
@@ -42,7 +42,7 @@
#include <asm/uaccess.h>
#include <mach/irqs.h>
-#include <mach/system.h>
+//#include <mach/system.h>
#include <mach/hardware.h>
#include <mach/gpio.h>
#include <linux/ctp.h>
@@ -1516,9 +1516,8 @@ static int ft5x_ts_probe(struct i2c_client *client, const struct i2c_device_id *
s_ft5x_ts = ft5x_ts;
queue_delayed_work(ft5x_ts->ts_workqueue, &ft5x_ts->pen_event_work, CTP_CHECK_DELAY);
#endif
- dprintk(DEBUG_INIT,"reg clk: 0x%08x\n", readl(0xf1c20a18));
+ //dprintk(DEBUG_INIT,"reg clk: 0x%08x\n", readl(0xf1c20a18));
-
i2c_dev = get_free_i2c_dev(client->adapter);
if (IS_ERR(i2c_dev)){
err = PTR_ERR(i2c_dev);
@@ -1555,7 +1554,7 @@ exit_check_functionality_failed:
return err;
}
-static int __devexit ft5x_ts_remove(struct i2c_client *client)
+static int ft5x_ts_remove(struct i2c_client *client)
{
struct ft5x_ts_data *ft5x_ts = i2c_get_clientdata(client);
@@ -1591,7 +1590,7 @@ MODULE_DEVICE_TABLE(i2c, ft5x_ts_id);
static struct i2c_driver ft5x_ts_driver = {
.class = I2C_CLASS_HWMON,
.probe = ft5x_ts_probe,
- .remove = __devexit_p(ft5x_ts_remove),
+ .remove = ft5x_ts_remove,
.id_table = ft5x_ts_id,
.suspend = ft5x_ts_suspend,
.resume = ft5x_ts_resume,
将模块文件放入系统里面加载,就能触摸了。
为什么改这么点就能用起来?
查看源码,发现它是使用工作队列间隔地上传坐标的,而不是一般常见的中断上传,所以也没有GPIO中断申请。而上电部分就如之前说的,不需要再操作。I2C用的总线是一样的都是i2c-1 ,使用标准的函数读写。所以这个驱动移植全志3.4到炬力3.10内核,工作很少。
3. 灵敏优化
在驱动中有初始化TP寄存器的内容:
ft5x_set_reg(103,100);//int enable,low,indicate mode
ft5x_set_reg(104,100);//int enable,low,indicate mode
查看A035VL01 V0_SPEC.pdf 的31 页
地址103和104分别X与Y灵敏度设置。现在设置为100,0是最灵敏,255 不灵敏
TP 驱动移植好后,再根据实际使用,调整下灵敏度
版主,有cubieboard2带cubiescreen的nand固件吗,百度云盘里找过了,没有
页:
[1]