屏幕选购
衡山派板载的有 RGB-40Pin 和 LVDS-40Pin 的屏幕接口。
衡山派出厂默认适配的是4.3寸RGB565(480*272)的屏幕。触摸芯片是GT911。
商家和我们没有任何合作,不处理任何关于屏幕的售后问题!!
RGB屏幕
RGB屏幕购买链接【1】
- 链接:【点击跳转🚀】
LVDS屏幕
LVDS屏幕购买链接【1】(未验证)
- LVDS屏幕链接(未验证):【点击跳转🚀】
百度网盘中的LVDS镜像使用的不是这个淘宝商家的屏幕,使用的是原厂的屏幕,所以这个商家的LVDS屏幕没有验证过,但应该问题不大!!!
屏幕适配
适配参考文档 1:【RTOS-SDK BringUP】屏幕配置
适配参考文档 2:【Display使用指南】屏幕适配
屏幕适配大部分只需要在menuconfig菜单中进行相关的参数配置即可。
触摸适配
开发板后面的6PinFPC接口是电容触摸接口
推荐直接使用GT911的触摸芯片,原厂对于该触摸芯片的适配最齐全
适配参考文档:【RTOS-SDK 外设移植】CTP调试指南
我这里以FT6336触摸芯片为例,大致说明一下触摸添加的步骤。
创建源码文件
在 bsp\peripheral\touch\
文件夹下创建 ft6336文件夹
。文件夹中的结构如下:
txt
ft6336-->
inc--->
ft6336.h
src--->
ft6336.c
1
2
3
4
5
6
2
3
4
5
6
编写驱动
ft6336.c文件如下:
c
/*
* Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Notes
* 2024-01-06 the first version
*/
#include <rtthread.h>
#include <rtdevice.h>
#include "touch.h"
#include "ft6336.h"
#include <rtdbg.h>
#define DBG_TAG "ft6336"
#define DBG_LVL DBG_INFO
//dev结构体定义,其他TP也需要定义这个变量
static struct rt_i2c_client ft6336_client;
/**
* 写寄存器
* @param bus I2C总线设备指针
* @param reg 寄存器地址
* @param value 要写入的值
* @return RT_EOK 成功;-RT_ERROR 失败
*/
static int ft6336_write_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t value)
{
struct rt_i2c_msg msg = {0};
rt_uint8_t buf[2];
buf[0] = reg;
buf[1] = value;
msg.addr = FT_SLAVE_ADDR;
msg.flags = RT_I2C_WR;
msg.buf = buf;
msg.len = 2;
if (rt_i2c_transfer(bus, &msg, 1) != 1)
{
LOG_E("[ft6336_write_reg]ft6336 write register error");
return -RT_ERROR;
}
return RT_EOK;
}
/**
* 读寄存器
* @param bus I2C总线设备指针
* @param reg 要读取的寄存器地址
* @param buf 用于保存读取的数据
* @param len 读取长度
* @return RT_EOK 成功;-RT_ERROR 失败
*/
static int ft6336_read_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *buf, rt_uint8_t len)
{
struct rt_i2c_msg msg = {0};
rt_uint8_t temp_reg;
temp_reg = reg;
msg.addr = FT_SLAVE_ADDR;
msg.flags = RT_I2C_WR;
msg.buf = &temp_reg;
msg.len = 1;
if (rt_i2c_transfer(bus, &msg, 1) != 1)
{
LOG_E("[ft6336_read_reg]ft6336 write register error");
return -RT_ERROR;
}
msg.addr = FT_SLAVE_ADDR;
msg.flags = RT_I2C_RD;
msg.buf = buf;
msg.len = len;
if (rt_i2c_transfer(bus, &msg, 1) != 1)
{
LOG_E("[ft6336_read_reg]ft6336 read register error");
return -RT_ERROR;
}
return RT_EOK;
}
/**
* 获取芯片ID和固件版本信息
*/
static void ft6336_get_id(void)
{
uint8_t ID = 0;
uint8_t LIB_Version[2] = {0};
uint8_t Firmware_Version = 0;
int ret = 0;
// 读ID
ret = ft6336_read_reg(ft6336_client.bus, FT_ID_G_FOCALTECH_ID, &ID, 1);
if(RT_EOK != ret)
{
LOG_E("FT6336 Read ID Failed !!");
}
else
{
LOG_I("FT6636 Read ID = 0x%x", ID);
}
// LIB版本
ret = ft6336_read_reg(ft6336_client.bus, FT_ID_G_LIB_VERSION_H, &LIB_Version[0], 1);
ret = ft6336_read_reg(ft6336_client.bus, FT_ID_G_LIB_VERSION_L, &LIB_Version[1], 1);
if(RT_EOK != ret)
{
LOG_E("FT6336 Read LIB Version info Failed !!");
}
else
{
LOG_I("FT6636 Read LIB Version info = 0x%x", LIB_Version[0]<<8 | LIB_Version[1]);
}
// 固件版本号
ret = ft6336_read_reg(ft6336_client.bus, FT_ID_G_FIRMWARE_VERSION, &Firmware_Version, 1);
if(RT_EOK != ret)
{
LOG_E("FT6336 Read Firmware Version Failed !!");
}
else
{
LOG_I("FT6636 Read Firmware Version = 0x%x", Firmware_Version);
}
}
/**
* ft6336获取点击手指数量
*/
static rt_err_t ft6336_get_info(struct rt_i2c_client *dev,
struct rt_touch_info *info)
{
info->point_num = 1;
return RT_EOK;
}
/**
* ft6336芯片配置
*/
static void ft6336_init(struct rt_i2c_bus_device *bus, rt_base_t pin)
{
rt_pin_mode(pin, PIN_MODE_OUTPUT);
rt_pin_write(pin, 0);
rt_thread_mdelay(50);
rt_pin_write(pin, 1);
rt_thread_mdelay(100);
ft6336_write_reg(bus, FT_DEVIDE_MODE, 0);
ft6336_write_reg(bus, FT_ID_G_THGROUP, 12);
ft6336_write_reg(bus, FT_ID_G_PERIODACTIVE, 12);
rt_thread_mdelay(500);
}
/**
* 读取触摸数据
* @param touch 触摸设备
* @param buf 需要被赋值的地址
* @param read_num 传入读取的手指数
* @return 触摸手指的数量
*/
static rt_size_t ft6336_read_point(struct rt_touch_device *touch, void *buf,
rt_size_t read_num)
{
rt_uint8_t data[4];
uint8_t point_num = 0;
static rt_uint8_t s_tp_down = 0;
static uint16_t x_save, y_save;
static rt_uint8_t s_count = 0;
struct rt_touch_data *temp_data;
temp_data = (struct rt_touch_data *)buf;
temp_data->event = RT_TOUCH_EVENT_NONE;
temp_data->timestamp = rt_touch_get_ts();
// ft6336_read_reg(ft6336_client.bus, FT_REG_NUM_FINGER, &point_num, 1);
// if(point_num == 0)
// {
// read_num = point_num;
// }
// else if(point_num == 1)
// {
// read_num = point_num;
// }
// else if(point_num == 2)
// {
// read_num = 1;
// }
ft6336_read_reg(ft6336_client.bus, FT_TP1_REG, data, 4);
temp_data->x_coordinate = ((data[0]&0X0F)<<8)+data[1];
temp_data->y_coordinate = ((data[2]&0X0F)<<8)+data[3];
temp_data->timestamp = rt_touch_get_ts();
if ((data[0]&0XC0)!=0X80) /* up event */
{
if (s_tp_down == 1)
{
if (++s_count > 2)
{
s_count = 0;
s_tp_down = 0;
temp_data->event = RT_TOUCH_EVENT_UP;
temp_data->timestamp = rt_touch_get_ts();
temp_data->x_coordinate = x_save;
temp_data->y_coordinate = y_save;
}
}
return read_num;
}
s_count = 0;
if (s_tp_down == 0) /* down event */
{
s_tp_down = 1;
temp_data->event = RT_TOUCH_EVENT_DOWN;
}
else /* move event */
{
temp_data->event = RT_TOUCH_EVENT_MOVE;
}
x_save = temp_data->x_coordinate;
y_save = temp_data->y_coordinate;
return read_num;
}
/**
* ft6336触摸设备控制
* @param touch 触摸设备
* @param cmd 命令
* @param arg 需要被复制的地址
* @return RT_EOK成功
*/
static rt_err_t ft6336_control(struct rt_touch_device *touch, int cmd, void *arg)
{
switch(cmd)
{
case RT_TOUCH_CTRL_GET_ID:
ft6336_get_id();
break;
case RT_TOUCH_CTRL_GET_INFO:
ft6336_get_info(&ft6336_client, (struct rt_touch_info *)arg);
break;
case RT_TOUCH_CTRL_SET_MODE:
break;
case RT_TOUCH_CTRL_SET_X_RANGE:
break;
case RT_TOUCH_CTRL_SET_Y_RANGE:
break;
case RT_TOUCH_CTRL_SET_X_TO_Y:
break;
case RT_TOUCH_CTRL_DISABLE_INT:
break;
case RT_TOUCH_CTRL_ENABLE_INT:
break;
default:
break;
}
return RT_EOK;
}
// device设备接口对接需要用到的结构体
static const struct rt_touch_ops ft6336_touch_ops =
{
.touch_readpoint = ft6336_read_point,
.touch_control = ft6336_control,
};
/**
* ft6336触摸设备控制
* @param name 触摸设备名
* @param cfg 相关的配置
* @param pin 复位引脚
* @return RT_EOK成功
*/
static int rt_hw_ft6336_init(const char *name, struct rt_touch_config *cfg, rt_base_t pin)
{
struct rt_touch_device *touch_device = RT_NULL;
touch_device = (rt_touch_t)rt_calloc(1, sizeof(struct rt_touch_device));
if (touch_device == RT_NULL)
{
return -RT_ENOMEM;
}
ft6336_client.bus = rt_i2c_bus_device_find(cfg->dev_name);
if (ft6336_client.bus == RT_NULL)
{
return -RT_EIO;
}
if (rt_device_open((rt_device_t)ft6336_client.bus, RT_DEVICE_FLAG_RDWR) !=
RT_EOK) {
LOG_E("open %s device failed", cfg->dev_name);
return -RT_ERROR;
}
ft6336_client.client_addr = FT_SLAVE_ADDR;
ft6336_init(ft6336_client.bus, pin);
rt_memcpy(&touch_device->config, cfg, sizeof(struct rt_touch_config));
touch_device->info.point_num = 1;
touch_device->info.type = RT_TOUCH_TYPE_CAPACITANCE;
touch_device->info.vendor = RT_TOUCH_VENDOR_FT;
touch_device->info.range_x = AIC_TOUCH_PANEL_FT7411_X_RANGE;
touch_device->info.range_y = AIC_TOUCH_PANEL_FT7411_Y_RANGE;
rt_memcpy(&touch_device->config, cfg, sizeof(struct rt_touch_config));
touch_device->ops = &ft6336_touch_ops;
if (RT_EOK != rt_hw_touch_register(touch_device, name, RT_DEVICE_FLAG_INT_RX, RT_NULL))
{
LOG_E("touch device ft6336 init failed !!!");
return -RT_ERROR;
}
LOG_I("touch device ft6336 init success");
return RT_EOK;
}
/**
* GPIO引脚初始化
*/
static int rt_ft6336_gpio_cfg()
{
unsigned int g, p;
long pin;
// RST
pin = drv_pin_get(AIC_TOUCH_PANEL_RST_PIN);
g = GPIO_GROUP(pin);
p = GPIO_GROUP_PIN(pin);
hal_gpio_direction_input(g, p);
// INT
pin = drv_pin_get(AIC_TOUCH_PANEL_INT_PIN);
g = GPIO_GROUP(pin);
p = GPIO_GROUP_PIN(pin);
hal_gpio_direction_input(g, p);
hal_gpio_set_irq_mode(g, p, 0);
return 0;
}
/**
* FT6336设备初始化
*/
static int rt_hw_ft6336_port(void)
{
struct rt_touch_config cfg;
rt_base_t rst_pin;
rt_ft6336_gpio_cfg();
rst_pin = rt_pin_get(AIC_TOUCH_PANEL_RST_PIN);
cfg.dev_name = AIC_TOUCH_PANEL_I2C_CHAN;
cfg.irq_pin.pin = rt_pin_get(AIC_TOUCH_PANEL_INT_PIN);
cfg.irq_pin.mode = PIN_MODE_INPUT;
cfg.user_data = &rst_pin;
rt_hw_ft6336_init("ft6336", &cfg, rst_pin);
// 读取ID测试
ft6336_get_id();
return 0;
}
// 自动初始化函数rt_hw_ft6336_port
INIT_DEVICE_EXPORT(rt_hw_ft6336_port);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
ft6336.h文件如下:
c
/*
* Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Notes
* 2024-01-06 the first version
*/
#ifndef __FT6336_H__
#define __FT6336_H__
#include "drivers/touch.h"
#include <aic_hal_gpio.h>
#include <aic_drv_gpio.h>
// 器件地址
#define FT_SLAVE_ADDR 0X38
// 部分寄存器定义
#define FT_DEVIDE_MODE 0x00 // FT6336 模式控制寄存器
#define FT_REG_NUM_FINGER 0x02 // 触摸状态寄存器
#define FT_TP1_REG 0X03 // 第一个触摸点数据地址
#define FT_TP2_REG 0X09 // 第二个触摸点数据地址
// 芯片和固件信息寄存器
#define FT_ID_G_CIPHER_MID 0x9F // 芯片代号(中字节)
#define FT_ID_G_CIPHER_LOW 0xA0 // 芯片代号(低字节)
#define FT_ID_G_LIB_VERSION_H 0xA1 // LIB 版本高8位
#define FT_ID_G_LIB_VERSION_L 0xA2 // LIB 版本低8位
#define FT_ID_G_CIPHER_HIGH 0xA3 // 芯片代号(高字节)
#define FT_ID_G_MODE 0xA4 // FT6636 中断模式控制寄存器
#define FT_ID_G_FIRMWARE_VERSION 0xA6 // 固件版本寄存器
#define FT_ID_G_FOCALTECH_ID 0xA8 // VENDOR ID
#define FT_ID_G_THGROUP 0x80 // 触摸有效值设置寄存器
#define FT_ID_G_PERIODACTIVE 0x88 // 激活状态周期设置寄存器
// 引脚和通道配置
#define FT6336_I2C_CHAN AIC_TOUCH_PANEL_I2C_CHAN
#define FT6336_RST_PIN AIC_TOUCH_PANEL_RST_PIN
#define FT6336_INT_PIN AIC_TOUCH_PANEL_INT_PIN
#define AIC_TOUCH_PANEL_FT7411_X_RANGE 480
#define AIC_TOUCH_PANEL_FT7411_Y_RANGE 800
#endif /* __FT6336_H__ */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
特别注意的是以下函数:
ft6336_read_point
:形参必须和上面代码一致,且返回值需要读取当前触摸屏幕的手指数量,如果返回值一直是0,则触摸就会没有反应。rt_ft6336_gpio_cfg
:可以直接复用,里面用的都是公共参数。ft6336_control
:必须实现RT_TOUCH_CTRL_GET_INFO这个选项相关的处理!!rt_hw_ft6336_port
:可以直接参考上面代码,基本可以复用。且必须要自动初始化INIT_DEVICE_EXPORT
添加编译路径
\luban-lite\bsp\peripheral\touch\SConscript
文件添加编译路径
py
if GetDepend('AIC_TOUCH_PANEL_FT6336'):
CPPPATH.append(cwd + '/ft6336/inc')
src += Glob('ft6336/src/*.c')
1
2
3
2
3
添加menuconfig菜单配置项
在 \luban-lite\bsp\peripheral\touch\Kconfig
文件中添加两个语句
ini
config AIC_TOUCH_PANEL_FT6336
bool "FT6336"
1
2
2
ini
default "ft6336" if AIC_TOUCH_PANEL_FT6336
1
menuconfig菜单配置
通过 scons --menuconfig
命令,进入配置页面,完成如下配置:
bash
Board options --->
[*] Using I2c2
I2c2 Parameter --->
[ ] Using I2C2 10-bit Addr(default 7-bit addr)
(400000) Setting I2C2 Transfer Speed
[ ] Using I2C2 Slave Mode(default master mode)
Rt-Thread options --->
RT-Thread Components --->
Device Drivers --->
[*] Using Touch device drivers
[*] touch irq use pin irq
Drivers options --->
Peripheral --->
Touch Panel Support --->
Select touch device (CTP) --->
(X) CTP
Select CTP device (FT6336) --->
(X) FT6336
(i2c2) Touch using I2C channel index #触摸I2C通道
(PA.10) Touch reset pin #复位引脚
(PA.11) Touch irq pin #中断引脚
(480) Touch x coordinate range #因为目前移植的屏幕是480*800的竖屏所以x和y的触摸范围设定为这样
(800) Touch y coordinate range
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
验证
我们编译然后烧录镜像,就能看到相关的屏幕触摸