转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>
DA9034是一个集成了电源管理、音频设备、触摸屏控制器和能用A/D|D/A转换的多功能芯片。最近读了一下相关驱动程序,这里记些笔记,不成体系,作为备忘而已。有兴趣的朋友可以一起讨论。
DA9034有两个输入设备,一个开关机键和触摸屏。
开关机键设备是一个platform device,在littleton.c中定义:
static struct platform_device micco_keys_device =
{
.name = "micco-keys",
.id = -1,
};
开关机键的驱动程序在drivers/input/keyboard/micco_keys.c里:
static struct platform_driver micco_keys_driver =
{
.probe = micco_keys_probe,
.remove = __devexit_p (micco_keys_remove),
.suspend = micco_keys_suspend,
.resume = micco_keys_resume,
.driver =
{
.name = "micco-keys",
},
};
在micco_keys_probe里会创建一个输入设备。
static int __devinit micco_keys_probe (struct platform_device *pdev)
{
input_dev = input_allocate_device ();
...
input_dev->name = pdev->name;
input_dev->id.bustype = BUS_HOST;
input_dev->open = micco_keys_open;
input_dev->close = micco_keys_close;
input_dev->dev.parent = &pdev->dev;
if (input_register_device (input_dev))
{
dev_err (&pdev->dev, "failed to register input device/n");
input_free_device (input_dev);
return -ENOMEM;
}
g_input_dev = input_dev;
return 0;
}
在micco_keys_open里会注册DA9034的中断处理函数:
static int micco_keys_open (struct input_dev *dev)
{
unsigned long flags;
spin_lock_irqsave (&g_use_count, flags);
if (g_use_count == 0)
{
if (pmic_callback_register (EVENT_KEYS, micco_keys_interrup) < 0)
{
spin_unlock_irqrestore (&g_use_count, flags);
return -1;
}
g_use_count ++;
}
spin_unlock_irqrestore (&g_use_count, flags);
return 0;
}
在第一篇笔记中,我们已经知道:在micco的中断处理函数中,会调用pmic_event_handle去分发中断事件,我们说过DA9034是一个多功能设备,每个设备都有自己的驱动程序,pmic_event_handle。所以只是一个总入口它只是调用各个实际驱动程序注册的回调函数:
对于开关机键的驱动程序,它注册了函数micco_keys_interrup给pmic_event_handle调用。在micco_keys_interrup函数里,会根据按键的状态上报输入事件。
if (event & PMIC_EVENT_ONKEY)
{
micco_read (MICCO_STATUS_A, &val);
input_report_key (g_input_dev, KEY_POWER, (val & MICCO_STATUS_A_ONKEY) ? 0 : 1);
}
触摸屏设备是一个platform device,在littleton.c中定义:
static struct platform_device micco_ts_device = {
.name = "micco-ts",
.id = -1,
};
触摸屏设备的驱动程序在drivers/input/touchscreen/micco_touch.c里:
static struct platform_driver micco_ts_driver = {
.driver = {
.name = "micco-ts",
},
.probe = micco_ts_probe,
.remove = micco_ts_remove,
.resume = micco_ts_resume,
.suspend = micco_ts_suspend,
};
和开关机键的probe函数一样,micco_ts_probe先注册了一个输入设备,不过还同时做了其它事件:
1. 注册了micco_ts_interrupt给pmic_event_handle调用。
2. 初始化触摸屏相关的寄存器。
3. 创建proc文件。
4. 注册笔点事件的处理函数。
static int micco_ts_probe(struct platform_device *pdev)
{
...
ret = input_register_device(micco_ts_input_dev);
...
ret = pmic_callback_register(PMIC_EVENT_TOUCH, micco_ts_interrupt);
...
micco_enable_pen_down_irq(1);
micco_tsi_poweron();
micco_ts_proc_entry = create_proc_entry("driver/micco_ts", 0, NULL);
...
ts_filter_create_chain (pdev, micco_ts_filter_apis, micco_ts_filter_configs, &micco_ts_filter, 2);
micco_ts_filter->api->clear (micco_ts_filter);
return 0;
}
在函数micco_ts_open中,创建了一个线程(micco_ts_thread)循环查询触摸屏的状态,对事件进行滤波处理后,上报给用户空间。
在中断处理函数micco_ts_interrupt里,只是唤醒事件处理线程。
分享到:
相关推荐
da4694的驱动程序,最底层的,硬件驱动,哈哈哈哈哈哈
AD5541是ADI公司的16串行DA转换器 本程序为DA的spi驱动程序
DA5614的verilog HDL驱动程序。实际验证可用。
实测可用带注释
本程序是在8051的基础上开发的,模数和数模转换的驱动程序设计。
da9034的芯片手册,英文版 Dialog 推出的IC——DA9034。此款IC整合了电源管理和音频子系统,特为快速增长的新兴产品(如智能手机,便携式多媒体播放器、PDA及个人浏览器等)中采用的最新一代应用处理器量身打造。该...
MEMS digital output motion sensor Ultra-low-power high performance 3-axes “DSC-XYZ” accelerometer
da5300 (DA) spi驱动程序 AD5300是ADI公司一款单通道、8位缓冲电压输出DAC,采用2.7 V至5.5 V单电源供电,3 V时功耗为115 µA。它内置片内精密输出放大器,能够实现轨到轨输出摆幅。AD5300采用多功能三线式串行...
16bit DA dac8830 C语言 驱动 程序 stm32 亲测通过
AD7091R DA转换的FPGA驱动程序
C8051F005的DA驱动程序(C语言).pdf
DA芯片TLC5620的完美驱动 DA芯片TLC5620的完美驱动
DASSIDirect是西门子PLC与Intouch连接通讯的必备驱动程序,这个驱动程序主要适用于西门子s7 200 300 400 1200 1500 400H等系列的设备型号,如果你是一名工业编程人员的话应该会用到这个驱动,有需要的快快下载吧。
基于STM32 MCU的 DA380驱动代码,包含完整的芯片初始化和设置接口,已通过测试
TI 10位DA TLC5615的驱动程序
DA芯片 AD5623R,AD5686_5684,VHDL驱动程序,Spartan-6,亲测通过, 例程中产生了两路正弦波,AD5686_5684可以驱动四路da
组态软件,Intouch驱动,通讯驱动,硬件驱动,通讯软件,Intouch驱动,DAServer DASSIDirect3.0
Q74--DAC902驱动程序+高速DA数模转换模块++原理图+资料-V0.2
这是da5619的驱动程序,非常好用,已经测试通过