触摸屏驱动分析

触摸屏驱动

触摸屏驱动分析

触摸屏驱动的主要函数如下:

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,经过查找,找到了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;
}

卸载函数,释放中断,释放设备,释放内存。</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔通天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值