Linux kernel driver for "I2C Touch Sensor Device", which controls the display brightness via backlight subsystem.
My learning project for writing linux kernel drivers.
Idea is to change brightness of STM32MP157F-DK2 board display. By touching linear sensor on STM32F072B-Disco board.
STM32F072B-Disco board project. Linear touch sensor detects position of finger on it. When touched sensor generates GPIO Output signal and writes position value in its register.
+----------------------------------+ +----------------------+
| STM32MP157-DK2 | | STM32F072B-Disco |
| | | |
| [1] I2C5_SCL CN13/D15 <-----+-----+--> P2/PB6 (I2C1_SCL) |
| [2] I2C5_SDA CN13/D14 <-----+-----+--> P2/PB7 (I2C1_SDA) |
| [3] GPIOG3 IRQ CN13/D8 <-----+-----+--- P2/PB9 |
| [4] VDD_5V CN16/5V ------+-----+--> P2/5V |
| [5] GND CN16/GND ------+-----+--> P2/GND |
| | | |
+----------------------------------+ +----------------------+
STM32F072B-Disco can be replaced with anything else, just keep powering from main board and common ground.
Register map is very simple. Only two one-byte read-only register.
| Address (hex) | Name | Size | Access | Reset | Description |
|---|---|---|---|---|---|
| 0x00 | STATUS | uint8_t | R | 0x00 | 0 / 1 |
| 0x01 | POS | uint8_t | R | 0x00 | 0 ... 100 |
Linear sensor writing position of finger to inner regs and generating PB9 GPIO output. Signal on CN13/D8 reads PB9 signal and triggering interrupt on main board. In this interrupt handler main board reading 0x00 and 0x01 registers from slave device.
If touch state is 1 then device changes its display brightness.
-
Follow guide to download developer-package with source code of main linux project. Build it for the first time https://wiki.st.com/stm32mpu/wiki/Getting_started/STM32MP1_boards/STM32MP157x-DK2/Develop_on_Arm%C2%AE_Cortex%C2%AE-A7
-
Add I2C Device to Device-Tree
&i2c5 {
backlight_sensor@2c {
compatible = "hometrustvendor,backlight-sensor";
reg = <0x2c>;
interrupt-parent = <&gpiog>;
interrupts = <3 IRQ_TYPE_EDGE_RISING>;
status = "okay";
backlight = <&panel_otm8009a>;
};
};
-
Add Driver file to kernel
drivers\misc\backlight_sensor.c -
Add Kkonfig
config BACKLIGHT_SENSOR
tristate "Backlight sensor driver"
depends on I2C
help
Simple I2C backlight sensor with IRQ support.
- Add row to makefile
obj-$(CONFIG_BACKLIGHT_SENSOR) += backlight_sensor.o
- Follow guide to rebuild and reload dts and uimage to board
- After reboot check if works, in terminal
dmesg | grep -i "backlight"
Output should have probe and interrupt prints;
[ 5.291089] backlight-sensor 1-002c: backlight_sensor bound to 5a000000.dsi.0 at addr 0x2c
[ 77.802001] backlight-sensor 1-002c: new backlight value:12
[ 77.807269] backlight-sensor 1-002c: new backlight value:17
[ 77.812829] backlight-sensor 1-002c: new backlight value:17
[ 77.818605] backlight-sensor 1-002c: new backlight value:24