简介
tiny4412的LCD上有一个STM8单片机控制背光和传输触屏数据,4412通过一线协议跟它通讯
dts
/dts-v1/;
#include "exynos4412.dtsi"
#include <dt-bindings/gpio/gpio.h>
/ {
model = "FriendlyARM TINY4412 board based on Exynos4412";
compatible = "friendlyarm,tiny4412", "samsung,exynos4412", "samsung,exynos4";
.......
backlight_demo_dts@139D0000{
compatible = "tiny4412,backlight_demo";
reg = <0x139D0000 0x1000>;
pinctrl-names = "backlight_in", "backlight_out";
pinctrl-0 = <&backlight_in>;
pinctrl-1 = <&backlight_out>;
tiny4412,backlight = <&gpx1 2 GPIO_ACTIVE_HIGH>;
clock-names = "timers";
clocks = <&clock CLK_PWM>;
interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>; //GIC_SPI :共享中断 GIC_PPI :每个处理器拥有独立中断
//不同厂家的pwm的表示是不一样的,具体看厂家代码实现 https://www.cnblogs.com/pengdonglin137/p/5172155.html
//第一个数 0:使用的那个PWM,这里我们传递的是0,表示获得PWM0对应的pwm_device
//第二个数 1000000000:我们把PWM的周期设置为了1000000000纳秒,也就是1秒
//第三个数 0:表示是否翻转
pwms = <&pwm 0 1000000000 0>;
};
};
&pinctrl_1 {
backlight_out: backlight_out {
samsung,pins = "gpx1-2";
samsung,pin-function = <EXYNOS_PIN_FUNC_OUTPUT>;
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
};
backlight_in: backlight_in {
samsung,pins = "gpx1-2";
samsung,pin-function = <EXYNOS_PIN_FUNC_INPUT>;
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
};
};
tiny4412_1wire.c
//参考友善自带的 Tiny4412_1wire_host.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <linux/bitops.h>
#include <linux/clk.h>
#include <linux/export.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/pwm.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/time.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/uaccess.h>
/*
PWM 时钟频率 100M
100M / 250 / 4 = 100000
1/100000 = 10us
*/
static int major;
static struct cdev backlight_cdev;
static struct class *cls;
static struct pinctrl *pctrl;
static struct pinctrl_state *pstate_in;
static struct pinctrl_state *pstate_out;
static int one_write_pin;
struct TIMER_BASE /*对应PWM base地址 相关变量被赋值为0x139D_0000*/
{
unsigned int TCFG0;
unsigned int TCFG1;
unsigned int TCON;
unsigned int TCNTB0;
unsigned int TCMPB0;
unsigned int TCNTO0;
unsigned int TCNTB1;
unsigned int TCMPB1;
unsigned int TCNTO1;
unsigned int TCNTB2;
unsigned int TCMPB2;
unsigned int TCNTO2;
unsigned int TCNTB3;
unsigned int TCMPB3;
unsigned int TCNTO3;
unsigned int TCNTB4;
unsigned int TCBTO4;
unsigned int TINT_CSTAT;
};
volatile static struct TIMER_BASE *timer = NULL;
static volatile unsigned int io_bit_count;
static volatile unsigned int io_data;
enum
{
IDLE,
START,
REQUEST,
WAITING,
RESPONSE,
STOPING,
} one_wire_status = IDLE;
static inline void stop_timer_for_1wire(void)
{
unsigned long tcon;
tcon = timer->TCON;
tcon &= ~(