文章目录
触摸屏驱动
触摸屏驱动分析
触摸屏驱动的主要函数如下:
tscadc_readl()
tscadc_writel()
tsc_setp_config()
tsc_idle_config()
tscadc_interrupt()
tscadc_probe()
tscadc_remove()
tscadc_suspend()
tscadc_resume()
ti_tsc_init()
ti_tsc_exit()
本次分析将对每个函数进行分析,了解每个函数的作用,以及函数在何时被调用。
ti_tsc_init函数和ti_tsc_exit函数
这两个函数较为简单,在platform总线驱动的框架下,进行驱动的注册和注销,将驱动的接口函数注册到内核当中。
tscadc_resume函数
这个函数是一个复位函数,对设备进行一系列的初始化。使设备在休眠状态被唤醒。
static int tscadc_resume(struct platform_device *pdev)
{
struct tscadc *ts_dev = platform_get_drvdata(pdev);
unsigned int restore;
pm_runtime_get_sync(&pdev->dev);
if (device_may_wakeup(&pdev->dev)) {
tscadc_writel(ts_dev, TSCADC_REG_IRQWAKEUP,
TSCADC_IRQWKUP_DISABLE);
tscadc_writel(ts_dev, TSCADC_REG_IRQCLR, TSCADC_IRQENB_HW_PEN);
}
/* context restore */
tscadc_writel(ts_dev, TSCADC_REG_CTRL, ts_dev->ctrl);
tsc_idle_config(ts_dev);
tsc_step_config(ts_dev);
tscadc_writel(ts_dev, TSCADC_REG_FIFO1THR, 6);
restore = tscadc_readl(ts_dev, TSCADC_REG_CTRL);
tscadc_writel(ts_dev, TSCADC_REG_CTRL,
(restore | TSCADC_CNTRLREG_TSCSSENB));
return 0;
}
驱动在此处进行了一系列的写寄存器操作,目的是为了触摸屏正常工作进行准备。
tscadc_resume函数寄存器使用情况
首先了解该函数的基本功能就是对设备的初始化,下一步进一步分析是如何对该设备进行的初始化。
用到的寄存器有TSCADC_REG_IRQWAKEUP、TSCADC_REG_IRQCLR、TSCADC_REG_CTRL、TSCADC_REG_FIFO1THR。
下面对每个寄存器进行分析:
TSCADC_REG_IRQWAKEUP
该寄存器十分简单,仅在第0位表示wakeup是否使能。
TSCADC_REG_IRQCLR
中断控制寄存器,该寄存器控制很多的中断使能。
该寄存器中的所有中断使能在中断状态寄存器中都有表示。
TSCADC_REG_CTRL
在代码中可以看到,向该寄存器中写入了设备结构体中的ctrl,经过查找,找到了ctrl的值。
位数 | 作用 |
---|---|
9 | 中断是否抢占软件step |
8 | 中断映射 |
7 | 触摸屏使能 |
6 | 设置5线模式 |
5 | 设置4线模式 |
4 | 电源控制 |
3 | adc偏置选择 |
2 | 寄存器写保护 |
1 | ADC ID tag |
0 | 使能 |
TSCADC_REG_FIFO1THR
6位,设置多少字节产生一次fifo中断,供CPU获取FIFO数据。
tscadc_suspend函数
static int tscadc_suspend(struct platform_device *pdev, pm_message_t state)
{
struct tscadc *ts_dev = platform_get_drvdata(pdev);
unsigned int idle;
if (device_may_wakeup(&pdev->dev)) {
idle = tscadc_readl(ts_dev, TSCADC_REG_IRQENABLE);
tscadc_writel(ts_dev, TSCADC_REG_IRQENABLE,
(idle | TSCADC_IRQENB_HW_PEN));
tscadc_writel(ts_dev, TSCADC_REG_IRQWAKEUP, TSCADC_IRQWKUP_ENB);
}
/* module disable */
idle = 0;
idle = tscadc_readl(ts_dev, TSCADC_REG_CTRL);
idle &= ~(TSCADC_CNTRLREG_TSCSSENB);
tscadc_writel(ts_dev, TSCADC_REG_CTRL, idle);
pm_runtime_put_sync(&pdev->dev);
return 0;
}
这个函数是一个暂停函数,使控制器进入暂停状态,继续执行一系列的写寄存器操作。
对寄存器就是停止使能的操作,进入休眠。
tscadc_remove函数
static int __devexit tscadc_remove(struct platform_device *pdev)
{
struct tscadc *ts_dev = platform_get_drvdata(pdev);
struct resource *res;
free_irq(ts_dev->irq, ts_dev);
input_unregister_device(ts_dev->input);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
iounmap(ts_dev->tsc_base);
release_mem_region(res->start, resource_size(res));
pm_runtime_disable(&pdev->dev);
kfree(ts_dev);
device_init_wakeup(&pdev->dev, 0);
platform_set_drvdata(pdev, NULL);
return 0;
}
卸载函数,释放中断,释放设备,释放内存。</