PXA310的电源管理(1)
2011-6-30 20:42:24
ipmc.c
相关驱动是作为一个杂项设备注册到系统中的,对应的设备节点为 /dev/ipmc
杂项设备(misc device)
杂项设备也是在嵌入式系统中用得比较多的一种设备驱动。在 Linux 内核的include/linux目录下有Miscdevice.h文件,
是一种主设备号为10的特殊字符设备。
cat /proc/devices
可以看到ipmc的主设备号为 10
cat /proc/misc
可以看到ipmc的次设备号为90
关注一下ipmc 对应的操作方法
static struct file_operations ipmc_fops = {
owner: THIS_MODULE,
open: ipmc_open,
read: ipmc_read,
write: ipmc_write,
poll: ipmc_poll,
ioctl: ipmc_ioctl,
release:ipmc_close,
};
性能资源管理 PRM(Performance Resources Managemen)
使用prm_resource 来描述一个性能资源
struct prm_resource {
struct prm_client *access; /* Only one client can access it */
prm_resource_id id;
struct prm_resource_state priority[MAX_PRIORITIES];
struct proc_dir_entry *dir;
};
每个资源都有一个资源状态数组
/* resources state */
struct prm_resource_state {
struct prm_client *allocate; /* which client allocate the resources. In every priority, there can be only one client allocate the resource*/
struct prm_group *group; /* which group it belongs to */
int active;
struct prm_resource *resource;
struct list_head entry; /* used by prm_group->resources for link the resources into the group */
struct proc_dir_entry *dir;
};
所有资源都存放在一个静态数组中
static struct prm_resource prm_resources[RESOURCE_NUM];
那么谁来使用性能资源?一个资源使用者,作为一个客户端
struct prm_client {
unsigned int id; /* client id */
unsigned int pid; /* process id for the client */
prm_priority priority; /* priority for the client.(LOW or HIGH) */
char *name; /* name of the client */
unsigned int group_cnt; /* How many groups in the client */
struct prm_group *groups[MAX_GROUPS]; /* support MAXGROUP groups, some may be NULL */
void *client_data;
clientcallback notify; /* notifier for resource appropriate and ready */
irq_handler_t handler;
void *dev_id;
struct proc_dir_entry *dir;
};
在初试化的时候,注册了软中断
#define IRQ_PMU PXA_IRQ(12) /* Performance Monitoring Unit */
软中断的处理函数就是就是调用prm_client的hanlder 方法 。
接下来回调ipmc的操作方法
open
1 创建一个会话,优先级为IPMC_CLI_PRI
对于PRM 来说就是在 prm_clients中找一个空闲位来存放新分配的prm_client地址
返回数组中的下标。
2 分配资源
根据前面返回的数组下标,资源ID和组ID来分配资源
PRM可以根据资源ID,找到对应资源和对应于该优先级的资源状态
查找资源状态信息,看资源是否已经被分配了,
如果没有就继续,否则返回失败
分配一个prm_group
把资源状态加入到组中
3 提交资源