DA9034驱动程序阅读笔记(6)

转载 2012年03月23日 22:35:53

转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>

DA9034是一个集成了电源管理、音频设备、触摸屏控制器和能用A/D|D/A转换的多功能芯片。最近读了一下相关驱动程序,这里记些笔记,不成体系,作为备忘而已。有兴趣的朋友可以一起讨论。

电源驱动主要是为用户空间提供一些接口,让用户空间可以查询相应的状态,比如是否在充电,以及电池的电量等。

电源设备是一个platform device,在littleton.c中定义:

static struct platform_device micco_power_device = {
.name = "micco-power",
.id = -1,
.dev = {
.platform_data = &power_pdata,
},
};

电源驱动程序在drivers/power/micco_power.c里:

static struct platform_driver micco_power_pdrv = {
.driver = {
.name = "micco-power",
},
.probe = micco_power_probe,
.remove = micco_power_remove,
.suspend = micco_power_suspend,
.resume = micco_power_resume,
};

在micco_power_probe函数里:

创建了两个timer:

setup_timer(&charger_timer, charger_timer_func, 0);
setup_timer(&supply_timer, supply_timer_func, 0);

charger_timer_func主要功能是更新充电状态,由于power_pdata里的回调函数都是空的,所以其实什么也没有做。

struct pda_power_pdata {
int (*init)(struct device *dev);
int (*is_ac_online)(void);
int (*is_usb_online)(void);
void (*set_charge)(int flags);
void (*exit)(struct device *dev);

char **supplied_to;
size_t num_supplicants;

unsigned int wait_for_status; /* msecs, default is 500 */
unsigned int wait_for_charger; /* msecs, default is 500 */
unsigned int polling_interval; /* msecs, default is 2000 */
};

static struct pda_power_pdata power_pdata = {
.polling_interval = 1000,
};

supply_timer_func主要功能是更新供电状态,最终会调用函数power_supply_changed_work:
由于external_power_changed是空的,所以power_supply_changed_work只做了两件事,一是更新充电指示灯,二是上报uevent通知用户空间。

static void power_supply_changed_work(struct work_struct *work)
{
struct power_supply *psy = container_of(work, struct power_supply,
changed_work);

dev_dbg(psy->dev, "%s/n", __func__);

class_for_each_device(power_supply_class, NULL, psy,
__power_supply_changed_work);

power_supply_update_leds(psy);

kobject_uevent(&psy->dev->kobj, KOBJ_CHANGE);
}

接下来注册了几个power supply:充电器、USB和电池:

/* register ac power supply */
ret = power_supply_register(power_dev, &micco_psy_ac);
if (ret) {
dev_err(power_dev, "failed to register %s power supply/n",
micco_psy_ac.name);
goto ac_supply_failed;
}

/* register usb power supply */
ret = power_supply_register(power_dev, &micco_psy_usb);
if (ret) {
dev_err(power_dev, "failed to register %s power supply/n",
micco_psy_usb.name);
goto usb_supply_failed;
}

/* register battery power supply */
ret = power_supply_register(power_dev, &micco_bat);
if (ret) {
dev_err(power_dev, "failed to register %s power supply/n",
micco_bat.name);
goto battery_supply_failed;
}

最后打开充设备:

ret = micco_charger_open();

现在看下充电器的supply:

只有一个“是否插上”的属性:

static enum power_supply_property micco_power_props[] = {
POWER_SUPPLY_PROP_ONLINE,
};

可以用来给主电池和备用电池充电:

static char *micco_power_supplied_to[] = {
"main-battery",
"backup-battery",
};

配置信息。

static struct power_supply micco_psy_ac = {
.name = "ac",
.type = POWER_SUPPLY_TYPE_MAINS,
.supplied_to = micco_power_supplied_to,
.num_supplicants = ARRAY_SIZE(micco_power_supplied_to),
.properties = micco_power_props,
.num_properties = ARRAY_SIZE(micco_power_props),
.get_property = micco_power_get_property,
};

USB的supply:其配置和充电器基本一样:
只有一个“是否插上”的属性:

static enum power_supply_property micco_power_props[] = {
POWER_SUPPLY_PROP_ONLINE,
};

可以用来给主电池和备用电池充电:

static char *micco_power_supplied_to[] = {
"main-battery",
"backup-battery",
};

static struct power_supply micco_psy_usb = {
.name = "usb",
.type = POWER_SUPPLY_TYPE_USB,
.supplied_to = micco_power_supplied_to,
.num_supplicants = ARRAY_SIZE(micco_power_supplied_to),
.properties = micco_power_props,
.num_properties = ARRAY_SIZE(micco_power_props),
.get_property = micco_power_get_property,
};

电池supply:
属性很多:

static enum power_supply_property micco_bat_props[] = {
POWER_SUPPLY_PROP_STATUS,
POWER_SUPPLY_PROP_PRESENT,
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_TECHNOLOGY,
POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_VOLTAGE_AVG,
POWER_SUPPLY_PROP_CURRENT_AVG,
POWER_SUPPLY_PROP_CAPACITY,
POWER_SUPPLY_PROP_TEMP,
POWER_SUPPLY_PROP_TEMP_AMBIENT,
POWER_SUPPLY_PROP_MANUFACTURER,
POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
};

static struct power_supply micco_bat = {
.name = "battery",
.type = POWER_SUPPLY_TYPE_BATTERY,
.properties = micco_bat_props,
.num_properties = ARRAY_SIZE(micco_bat_props),
.get_property = micco_bat_get_property,
.use_for_apm = 1,
};

十、硬盘驱动程序

硬盘分区表 创建磁盘分区表 文件系统是运行在操作系统中的软件模块,是操作系统中提供的一套管理磁盘文件读写方法和数据组织、储存形式。因此文件系统是程序。它的管理对象是文件,管辖范围是分区,因此文件系统是...
  • zhangyang249
  • zhangyang249
  • 2017年12月02日 08:54
  • 48

人脸识别学习笔记(1)

人脸识别学习笔记(1)  1) 相关科学      神经生理学,神经病理学,心理学,脑神经学,计算机视觉。2...
  • hawksoft
  • hawksoft
  • 2017年08月01日 15:00
  • 387

linux设备驱动程序(第三版)阅读笔记(三)

说明:版权所有归作者,只供学习交流,若有其它用途请联系作者,转载请遵守IT人职业规范,请注明转载地址   第三章:字符设备驱动程序 1,(设备编号的内部表示)在内核中, dev_t 类型(...
  • tanghui19900420
  • tanghui19900420
  • 2013年04月24日 08:25
  • 534

[javascript权威指南][阅读笔记]六

第八章   函数
  • buptlyz
  • buptlyz
  • 2016年07月18日 11:39
  • 411

深度学习学术论文阅读笔记(一)之经典学术论文阅读笔记

深度学习算法主要分类三大类:自动编码器,深度神经网络和卷积神经网络。下面是对这三种网络分类进行的初步调研。 深度学习6篇非常重要的文章:   1.《Learning multiple layers o...
  • lqfarmer
  • lqfarmer
  • 2015年05月04日 12:40
  • 2356

代码笔记总结(一些别人写的代码)

一些别人写的代码,只是觉得写得可以自己可以以后拿来使用的。 1、关于反射的,如何通过一个只用调用一个方法就可以接接收不同的对象并调用其实例方法:这些类必须实现或者继承同一个父类,然后用里氏替换原则(想...
  • w369033345
  • w369033345
  • 2016年07月11日 13:55
  • 542

caffe代码阅读6:SyncedMemory的j介绍与实现

一、SyncedMemory的作用简介 SyncedMemory类主要负责在GPU或者CPU上分配内存以及保持数据的同步作用。 SyncedMemory类主要应用在BLOB类中,我们可以在BL...
  • boon_228
  • boon_228
  • 2017年02月07日 15:28
  • 333

JM16.0代码阅读过程中的C语言函数学习

C语言的一些函数学习
  • bumpbee
  • bumpbee
  • 2014年12月12日 13:35
  • 628

JDK 1.7源码阅读笔记(五)集合类之Collection

前言  Collection是个接口类,可以说它是集合类的源头,Set接口、List接口、Queue接口都是实现了Collection接口,其提供了一些通用的方法,但未提供任何具体的实现,提供此类是为...
  • longlong2015
  • longlong2015
  • 2015年09月02日 16:44
  • 738

DeepID2人脸识别算法学习

DeepID2 验证信号 认证信号
  • eli00001
  • eli00001
  • 2016年03月30日 16:40
  • 2151
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DA9034驱动程序阅读笔记(6)
举报原因:
原因补充:

(最多只允许输入30个字)