7.3.4.入口函数注册驱动
97: static int __init led_init(void)
98: {
99: int err;
100: int i;
101:
102: printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
/* 将led_drv注册到内核中,设备名称为100ask_led,设备号由内核分配*/
103: major = register_chrdev(0, "100ask_led", &led_drv); /* /dev/led */
106: led_class = class_create(THIS_MODULE, "100ask_led_class");
107: err = PTR_ERR(led_class);
108: if (IS_ERR(led_class)) {
109: printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
110: unregister_chrdev(major, "led");
111: return -1;
112: }
113:
114: for (i = 0; i < LED_NUM; i++)
115: device_create(led_class, NULL, MKDEV(major, i), NULL, "100ask_led%d", i);
115: /* /dev/100ask_led0,1,... */
117: p_led_opr = get_board_led_opr();
118:
119: return 0;
120: }
下面一句一句分析下:
7.3.4.1.1.register_chrdev注册字符设备
/* 把file_operations结构体告诉内核:register_chrdev*/
103: major = register_chrdev(0, "100ask_led", &led_drv); /* /dev/led */
看下函数原型,了解了就是根据fops和name到内核中报个名,注册一下。
static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
{
return __register_chrdev(major, 0, 256, name, fops);
}
/**
* __register_chrdev() - create and register a cdev occupying a range of minors
* @major: major device number or 0 for dynamic allocation
* @baseminor: first of the requested range of minor numbers
* @coun