一.input_allocate_device分析,看看这个东西,到底完成了什么样的工作,应该不是简单的kmalloc
struct input_dev *input_allocate_device(void)
{
struct input_dev *dev; //一个input_dev的指针
dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL); //分配工作
if (dev) {
dev->dev.type = &input_dev_type; //对input_dev继成的device结构的初始化
*******************************************************************************8
static struct device_type input_dev_type = {
.groups = input_dev_attr_groups, //设备属性的初始化
.release = input_dev_release, //设备释放函数,应该是个回调函数
.uevent = input_dev_uevent, //设备所支持的事件
#ifdef CONFIG_PM
.pm = &input_dev_pm_ops, //电源管理
#endif
};
*******************************************************************************
dev->dev.class = &input_class; //这个不太明白
device_initialize(&dev->dev);
******************************************************************************
void device_initialize(struct device *dev)
{
dev->kobj.kset = devices_kset; //将这个对象属于这个device_kset集
kobject_init(&dev->kobj, &device_ktype); //kobj的初始化,计数为1
INIT_LIST_HEAD(&dev->dma_pools); //初始化DMA链表
init_MUTEX(&dev->sem); //信号量的初始化。互斥访问
spin_lock_init(&dev->devres_lock);
INIT_LIST_HEAD(&dev->devres_head);
device_init_wakeup(dev, 0); //如果可以被唤醒,则唤醒
device_pm_init(dev); //初始化电源管理
set_dev_node(dev, -1);
*****************************************
//static inline void set_dev_node(struct device *dev, int node)
{
dev->numa_node = node;//这个不明白有什么作用
}
*****************************************
}
*****************************************************************************
mutex_init(&dev->mutex);
spin_lock_init(&dev->event_lock);
INIT_LIST_HEAD(&dev->h_list); //handler链表初始化
INIT_LIST_HEAD(&dev->node); //input_dev链表初始化
__module_get(THIS_MODULE);
}
return dev;
struct input_dev *input_allocate_device(void)
{
struct input_dev *dev; //一个input_dev的指针
dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL); //分配工作
if (dev) {
dev->dev.type = &input_dev_type; //对input_dev继成的device结构的初始化
*******************************************************************************8
static struct device_type input_dev_type = {
.groups = input_dev_attr_groups, //设备属性的初始化
.release = input_dev_release, //设备释放函数,应该是个回调函数
.uevent = input_dev_uevent, //设备所支持的事件
#ifdef CONFIG_PM
.pm = &input_dev_pm_ops, //电源管理
#endif
};
*******************************************************************************
dev->dev.class = &input_class; //这个不太明白
device_initialize(&dev->dev);
******************************************************************************
void device_initialize(struct device *dev)
{
dev->kobj.kset = devices_kset; //将这个对象属于这个device_kset集
kobject_init(&dev->kobj, &device_ktype); //kobj的初始化,计数为1
INIT_LIST_HEAD(&dev->dma_pools); //初始化DMA链表
init_MUTEX(&dev->sem); //信号量的初始化。互斥访问
spin_lock_init(&dev->devres_lock);
INIT_LIST_HEAD(&dev->devres_head);
device_init_wakeup(dev, 0); //如果可以被唤醒,则唤醒
device_pm_init(dev); //初始化电源管理
set_dev_node(dev, -1);
*****************************************
//static inline void set_dev_node(struct device *dev, int node)
{
dev->numa_node = node;//这个不明白有什么作用
}
*****************************************
}
*****************************************************************************
mutex_init(&dev->mutex);
spin_lock_init(&dev->event_lock);
INIT_LIST_HEAD(&dev->h_list); //handler链表初始化
INIT_LIST_HEAD(&dev->node); //input_dev链表初始化
__module_get(THIS_MODULE);
}
return dev;
}
不对之处,望大家多多指教