<!-- END HEADER --> <!-- LEFTBAR -->
转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>
DA9034是一个集成了电源管理、音频设备、触摸屏控制器和能用A/D|D/A转换的多功能芯片。最近读了一下相关驱动程序,这里记些笔记,不成体系,作为备忘而已。有兴趣的朋友可以一起讨论。
在Broncho A1中DA9034与CPU PXA300/PXA310之间用I2C连接。
o 在littleton.c里定义了DA9034的设备信息:
#if defined(CONFIG_I2C_BOARDINFO)
static struct i2c_board_info littleton_i2c_board_info[] = {
#if defined(CONFIG_PXA3xx_MICCO) || defined(CONFIG_PXA3xx_MICCO_MODULE)
{
.type = "micco",
.addr = 0x34,
.platform_data = &micco_data,
.irq = IRQ_GPIO(mfp_to_gpio(MFP_CFG_PIN(MFP_PMIC_INT))),
},
#endif
DA9034的nIRQ引脚连接到CPU的GPIO MFP_PMIC_INT上,DA9034有事件发生时,会通过这个引脚上报给CPU。
o 驱动程序在i2c/chips/micco.c里。
static const struct i2c_device_id micco_id[] = {
{ "micco", 0 },
{ }
};
static struct i2c_driver micco_driver = {
.driver = {
.name = "micco",
},
.probe = micco_probe,
.remove = micco_remove,
.id_table = micco_id,
.suspend = micco_suspend,
.resume = micco_resume,
};
id_table 主要用来匹配设备与驱动程序的。
对于I2C驱动程序来说,只是比较它们的名字是否相同。
static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,
const struct i2c_client *client)
{
while (id->name[0]) {
if (strcmp(client->name, id->name) == 0)
return id;
id++;
}
return NULL;
}
static int i2c_device_match(struct device *dev, struct device_driver *drv)
{
struct i2c_client *client = to_i2c_client(dev);
struct i2c_driver *driver = to_i2c_driver(drv);
/* make legacy i2c drivers bypass driver model probing entirely;
* such drivers scan each i2c adapter/bus themselves.
*/
if (!is_newstyle_driver(driver))
return 0;
/* match on an id table if there is one */
if (driver->id_table)
return i2c_match_id(driver->id_table, client) != NULL;
return 0;
}
一旦匹配上之后,就会调用micco_probe。在micco_probe函数中。这个函数:
初始化:
ret = micco_initchip();
pdata->init_irq();
micco_initchip主要是初始驱动程序的一些全局变量和寄存器MICCO_SYSCTRL_A。
init_irq是在micco_data里定义,即函数micco_init_irq,里面把GPIO MFP_PMIC_INT设置为输入模式。
注册GPIO的中断:
ret = request_irq(client->irq, micco_irq_handler, IRQF_TRIGGER_FALLING,
"Micco", client);
micco_irq_handler是比较重要的,它先调用pdata->ack_irq(即micco_ack_irq),其实什么都没有做。
然后调用schedule_work(&pdata->work);,导步去处理中断事件。这个work会执行函数micco_worker,micco_worker做了两件事:
1.调用micco_event_change去查询MICCO_EVENT_A、MICCO_EVENT_B、MICCO_EVENT_C和MICCO_EVENT_D几个寄存器的内容,并记录下来。
2.调用pmic_event_handle去分发事件,我们说过DA9034是一个多功能设备,每个设备都有自己的驱动程序,这里只是一个总的入口。所以这里只是调用各个实际驱动程序的回调函数:
list_for_each_entry(pmic_cb, &pxa3xx_pmic_ops->list, list) {
spin_unlock_irqrestore(&pxa3xx_pmic_ops->cb_lock, flags);
/* event is bit-wise parameter, need bit AND here as filter */
if ((pmic_cb->event & event) && (pmic_cb->func))
pmic_cb->func(event);
spin_lock_irqsave(&pxa3xx_pmic_ops->cb_lock, flags);
}
在注册后中断处理函数之后,micco_probe然后调用平台初始化函数pdata->platform_init(即littleton_micco_init),这里对DA9034芯片做了实际的初始化。
最后micco_probe注册了电源管理的回调函数:
pmic_set_ops(&micco_pmic_ops);
这里对i2c的读写函数做了包装,提供用于读写寄存器的函数:micco_read/micco_write。
这里也对基本操作提供了包装函数,如:
int micco_tsi_enable_tsi(int tsi_en)
{
int status;
u8 val;
status = micco_read(MICCO_ADC_AUTO_CONTROL_2, &val);
if (status)
return -EIO;
if (tsi_en)
val |= MICCO_ADC_AUTO_2_TSI_EN;
else
val &= ~MICCO_ADC_AUTO_2_TSI_EN;
status = micco_write(MICCO_ADC_AUTO_CONTROL_2, val);
if (status)
return -EIO;
return 0;
}
这些函数会在实际的驱动程序中被调用,后面看了其它代码再分析吧。
分享到:
相关推荐
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
16bit DA dac8830 C语言 驱动 程序 stm32 亲测通过
AD7091R DA转换的FPGA驱动程序
da5300 (DA) spi驱动程序 AD5300是ADI公司一款单通道、8位缓冲电压输出DAC,采用2.7 V至5.5 V单电源供电,3 V时功耗为115 µA。它内置片内精密输出放大器,能够实现轨到轨输出摆幅。AD5300采用多功能三线式串行...
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
Q74--DAC902驱动程序+高速DA数模转换模块++原理图+资料-V0.2
组态软件,Intouch驱动,通讯驱动,硬件驱动,通讯软件,Intouch驱动,DAServer DASSIDirect3.0
这是da5619的驱动程序,非常好用,已经测试通过