Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
混口饭吃,
rt-thread
提交
b5bb1f57
R
rt-thread
项目概览
混口饭吃,
/
rt-thread
与 Fork 源项目一致
Fork自
Mr_Pangza / rt-thread
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b5bb1f57
编写于
10月 03, 2018
作者:
xuzhuoyi96
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[bsp][stm32f429-disco] Add touchscreen support
上级
a0c848b0
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
278 addition
and
0 deletion
+278
-0
bsp/stm32f429-disco/drivers/drv_touch.c
bsp/stm32f429-disco/drivers/drv_touch.c
+197
-0
bsp/stm32f429-disco/drivers/drv_touch.h
bsp/stm32f429-disco/drivers/drv_touch.h
+81
-0
未找到文件。
bsp/stm32f429-disco/drivers/drv_touch.c
0 → 100644
浏览文件 @
b5bb1f57
/*
* File : drv_touch.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2018 RT-Thread Develop Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2018-10-03 xuzhuoyi first implementation.
*/
#include "drv_touch.h"
#include "drivers/i2c.h"
#define TSC_I2C_ADDR 0x41
/* 7-bit I2C address */
static
struct
rt_i2c_bus_device
*
stmpe811_i2c_bus
;
/**
\fn int32_t touch_readRegister (uint8_t reg, uint8_t *val)
\brief Read register value from Touchscreen controller
\param[in] reg Register address
\param[out] val Pointer where data will be read from register
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
static
int32_t
touch_read
(
uint8_t
reg
,
uint8_t
*
val
)
{
struct
rt_i2c_msg
msgs
[
2
];
msgs
[
0
].
addr
=
TSC_I2C_ADDR
;
msgs
[
0
].
flags
=
RT_I2C_WR
;
msgs
[
0
].
buf
=
&
reg
;
msgs
[
0
].
len
=
1
;
msgs
[
1
].
addr
=
TSC_I2C_ADDR
;
msgs
[
1
].
flags
=
RT_I2C_RD
;
msgs
[
1
].
buf
=
val
;
msgs
[
1
].
len
=
1
;
if
(
rt_i2c_transfer
(
stmpe811_i2c_bus
,
msgs
,
2
)
==
2
)
{
return
RT_EOK
;
}
else
{
return
-
RT_ERROR
;
}
}
/**
\fn int32_t touch_writeData (uint8_t reg, const uint8_t *val)
\brief Write value to Touchscreen controller register
\param[in] reg Register address
\param[in] val Pointer with data to write to register
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
static
int32_t
touch_write
(
uint8_t
reg
,
uint8_t
val
)
{
struct
rt_i2c_msg
msgs
;
rt_uint8_t
buf
[
2
]
=
{
reg
,
val
};
msgs
.
addr
=
TSC_I2C_ADDR
;
msgs
.
flags
=
RT_I2C_WR
;
msgs
.
buf
=
buf
;
msgs
.
len
=
2
;
if
(
rt_i2c_transfer
(
stmpe811_i2c_bus
,
&
msgs
,
1
)
==
1
)
{
return
RT_EOK
;
}
else
{
return
-
RT_ERROR
;
}
}
/**
\fn int32_t Touch_Initialize (void)
\brief Initialize touchscreen
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t
Touch_Initialize
(
void
)
{
stmpe811_i2c_bus
=
rt_i2c_bus_device_find
(
STMPE811_I2CBUS_NAME
);
// ptrI2C->Initialize (NULL);
// ptrI2C->PowerControl(ARM_POWER_FULL);
// ptrI2C->Control (ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_FAST);
// ptrI2C->Control (ARM_I2C_BUS_CLEAR, 0);
touch_write
(
STMPE811_SYS_CTRL1
,
0x02
);
/* Reset Touch-screen controller */
rt_thread_mdelay
(
10
);
/* Wait 10ms */
touch_write
(
STMPE811_SYS_CTRL2
,
0x0C
);
/* Enable TSC and ADC */
touch_write
(
STMPE811_ADC_CTRL1
,
0x68
);
/* Set sample time , 12-bit mode */
rt_thread_mdelay
(
1
);
/* Wait 1ms */
touch_write
(
STMPE811_ADC_CTRL2
,
0x01
);
/* ADC frequency 3.25 MHz */
touch_write
(
STMPE811_TSC_CFG
,
0xC2
);
/* Detect delay 10us,
Settle time 500us */
touch_write
(
STMPE811_FIFO_TH
,
0x01
);
/* Threshold for FIFO */
touch_write
(
STMPE811_FIFO_STA
,
0x01
);
/* FIFO reset */
touch_write
(
STMPE811_FIFO_STA
,
0x00
);
/* FIFO not reset */
touch_write
(
STMPE811_TSC_FRACTION_Z
,
0x07
);
/* Fraction z */
touch_write
(
STMPE811_TSC_I_DRIVE
,
0x01
);
/* Drive 50 mA typical */
touch_write
(
STMPE811_GPIO_AF
,
0x00
);
/* Pins are used for touchscreen */
touch_write
(
STMPE811_TSC_CTRL
,
0x01
);
/* Enable TSC */
return
0
;
}
/**
\fn int32_t Touch_Uninitialize (void)
\brief De-initialize touchscreen
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t
Touch_Uninitialize
(
void
)
{
touch_write
(
STMPE811_SYS_CTRL1
,
0x02
);
/* Reset Touch-screen controller */
return
0
;
}
/**
\fn int32_t Touch_GetState (TOUCH_STATE *pState)
\brief Get touchscreen state
\param[out] pState pointer to TOUCH_STATE structure
\returns
- \b 0: function succeeded
- \b -1: function failed
*/
int32_t
Touch_GetState
(
struct
touch_state
*
pState
)
{
uint8_t
val
;
uint8_t
num
;
uint8_t
xyz
[
4
];
int32_t
res
;
uint8_t
buf
[
4
];
struct
rt_i2c_msg
msgs
;
/* Read touch status */
res
=
touch_read
(
STMPE811_TSC_CTRL
,
&
val
);
if
(
res
<
0
)
return
-
1
;
pState
->
pressed
=
(
val
&
(
1
<<
7
))
?
1
:
0
;
if
(
pState
->
pressed
)
{
val
=
STMPE811_TSC_DATA
;
/* If FIFO overflow, discard all samples except the last one */
res
=
touch_read
(
STMPE811_FIFO_SIZE
,
&
num
);
if
(
res
<
0
||
num
==
0
)
return
-
1
;
while
(
num
--
)
{
msgs
.
addr
=
TSC_I2C_ADDR
;
msgs
.
flags
=
RT_I2C_WR
;
msgs
.
buf
=
buf
;
msgs
.
len
=
1
;
rt_i2c_transfer
(
stmpe811_i2c_bus
,
&
msgs
,
1
);
//ptrI2C->MasterTransmit (TSC_I2C_ADDR, &val, 1, true);
//while (ptrI2C->GetStatus().busy);
msgs
.
addr
=
TSC_I2C_ADDR
;
msgs
.
flags
=
RT_I2C_RD
;
msgs
.
buf
=
buf
;
msgs
.
len
=
4
;
rt_i2c_transfer
(
stmpe811_i2c_bus
,
&
msgs
,
1
);
//ptrI2C->MasterReceive (TSC_I2C_ADDR, xyz, 4, false);
//while (ptrI2C->GetStatus().busy);
}
pState
->
x
=
(
int16_t
)((
xyz
[
0
]
<<
4
)
|
((
xyz
[
1
]
&
0xF0
)
>>
4
));
pState
->
y
=
(
int16_t
)
(
xyz
[
2
]
|
((
xyz
[
1
]
&
0x0F
)
<<
8
));
}
else
{
/* Clear all data in FIFO */
touch_write
(
STMPE811_FIFO_STA
,
0x1
);
touch_write
(
STMPE811_FIFO_STA
,
0x0
);
}
return
0
;
}
bsp/stm32f429-disco/drivers/drv_touch.h
0 → 100644
浏览文件 @
b5bb1f57
/*
* File : drv_touch.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2018 RT-Thread Develop Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2018-10-03 xuzhuoyi first implementation.
*/
#ifndef __DRV_TOUCH_H__
#define __DRV_TOUCH_H__
#include <stdint.h>
/* Register addresses */
#define STMPE811_CHIP_ID 0x00
#define STMPE811_ID_VER 0x02
#define STMPE811_SYS_CTRL1 0x03
#define STMPE811_SYS_CTRL2 0x04
#define STMPE811_SPI_CFG 0x08
#define STMPE811_INT_CTRL 0x09
#define STMPE811_INT_EN 0x0A
#define STMPE811_INT_STA 0x0B
#define STMPE811_GPIO_EN 0x0C
#define STMPE811_GPIO_INT_STA 0x0D
#define STMPE811_ADC_INT_EN 0x0E
#define STMPE811_ADC_INT_STA 0x0F
#define STMPE811_GPIO_SET_PIN 0x10
#define STMPE811_GPIO_CLR_PIN 0x11
#define STMPE811_GPIO_MP_STA 0x12
#define STMPE811_GPIO_DIR 0x13
#define STMPE811_GPIO_ED 0x14
#define STMPE811_GPIO_RE 0x15
#define STMPE811_GPIO_FE 0x16
#define STMPE811_GPIO_AF 0x17
#define STMPE811_ADC_CTRL1 0x20
#define STMPE811_ADC_CTRL2 0x21
#define STMPE811_ADC_CAPT 0x22
#define STMPE811_ADC_DATA_CH0 0x30
#define STMPE811_ADC_DATA_CH1 0x32
#define STMPE811_ADC_DATA_CH2 0x34
#define STMPE811_ADC_DATA_CH3 0x36
#define STMPE811_ADC_DATA_CH4 0x38
#define STMPE811_ADC_DATA_CH5 0x3A
#define STMPE811_ADC_DATA_CH6 0x3C
#define STMPE811_ADC_DATA_CH7 0x3E
#define STMPE811_TSC_CTRL 0x40
#define STMPE811_TSC_CFG 0x41
#define STMPE811_WDW_TR_X 0x42
#define STMPE811_WDW_TR_Y 0x44
#define STMPE811_WDW_BL_X 0x46
#define STMPE811_WDW_BL_Y 0x48
#define STMPE811_FIFO_TH 0x4A
#define STMPE811_FIFO_STA 0x4B
#define STMPE811_FIFO_SIZE 0x4C
#define STMPE811_TSC_DATA_X 0x4D
#define STMPE811_TSC_DATA_Y 0x4F
#define STMPE811_TSC_DATA_Z 0x51
#define STMPE811_TSC_FRACTION_Z 0x56
#define STMPE811_TSC_DATA_XYZ 0x57
#define STMPE811_TSC_DATA 0xD7
#define STMPE811_TSC_I_DRIVE 0x58
#define STMPE811_TSC_SHIELD 0x59
#define STMPE811_TEMP_CTRL 0x60
#define STMPE811_TEMP_DATA 0x61
#define STMPE811_TEMP_TH 0x62
/* Touch state */
struct
touch_state
{
int16_t
x
;
///< Position X
int16_t
y
;
///< Position Y
uint8_t
pressed
;
///< Pressed flag
uint8_t
padding
;
};
#endif
/* __DRV_TOUCH_H__ */
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录