linux设备驱动模型代码分析

struct i2c_client *i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
	struct i2c_client	*client;
	client->adapter = adap;

	client->dev.platform_data = info->platform_data;
	
	client->dev.parent = &client->adapter->dev;
	client->dev.bus = &i2c_bus_type;
	client->dev.type = &i2c_client_type;
	
	dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap), client->addr);
	status = device_register(&client->dev);
	=>int device_register(struct device *dev)
		device_initialize(dev);
		=>void device_initialize(struct device *dev)
			dev->kobj.kset = devices_kset;
			kobject_init(&dev->kobj, &device_ktype);
		
		return device_add(dev);
		=>int device_add(struct device *dev)
			parent = get_device(dev->parent);
			setup_parent(dev, parent);
			
			error = kobject_add(&dev->kobj, dev->kobj.parent, NULL);
			
			error = device_create_file(dev, &uevent_attr);
			
			if (MAJOR(dev->devt))
				error = device_create_file(dev, &devt_attr);
				
				error = device_create_sys_dev_entry(dev);
				=>int device_create_sys_dev_entry(struct device *dev)
					struct kobject *kobj = device_to_dev_kobj(dev);
					if (kobj) 
						format_dev_t(devt_str, dev->devt);
						error = sysfs_create_link(kobj, &dev->kobj, devt_str);
						
			error = device_add_class_symlinks(dev);
			=>int device_add_class_symlinks(struct device *dev)
				error = sysfs_create_link(&dev->kobj, &dev->class->p->class_subsys.kobj, "subsystem");
				//举例,实设备下定义subsystem反指虚设备
					/sys/devices/e f000 0000.soc/f f011 9100.i2c/i2c-3/3-0055/rtc/rtc0 ]# ls -l
					subsystem->../../../../../../../class/rtc
					
				error = sysfs_create_link(&dev->class->p->class_subsys.kobj, &dev->kobj, dev_name(dev));			
				error = sysfs_create_link(&dev->kobj, &dev->parent->kobj, "device");
				//举例,
					/sys/class/rtc ]# ls -l
					rtc0->../../devices/e f000 0000.soc/f f011 9100.i2c/i2c-3/3-0055/rtc/rtc0
					device->../../../3-0055
				
			error = device_add_attrs(dev);
			
			error = bus_add_device(dev);
			=>int bus_add_device(struct device *dev)
				struct bus_type *bus = bus_get(dev->bus);
				if (bus)
					error = device_add_attrs(bus, dev);
					
					error = sysfs_create_link(&bus->p->devices_kset->kobj, &dev->kobj, dev_name(dev));
					//举例,bus是虚设备,所以链接指向实际设备
						/sys/bus/i2c/devices ]# ls -l
						3-0055->../../../devices/e f000 0000.soc/f f011 9100.i2c/i2c-3/3-0055
										
					error = sysfs_create_link(&dev->kobj, &dev->bus->p->subsys.kobj, "subsystem");
					//举例,实设备下定义subsystem反指虚设备
						/sys/devices/e f000 0000.soc/f f011 9100.i2c/i2c-3/3-0055 ]# ls -l
						subsystem->../../../../../bus/i2c
					
					klist_add_tail(&dev->p->knode_bus, &bus->p->klist_devices);
					
				if (dev->bus)
					blocking_notifier_call_chain(&dev->bus->p->bus_notifier, BUS_NOTIFY_ADD_DEVICE, dev);
					
				kobject_uevent(&dev->kobj, KOBJ_ADD);
				
				bus_probe_device(dev);
				
				if (parent)
					klist_add_tail(&dev->p->knode_parent, &parent->p->klist_children);
					
				if (dev->class)
					klist_add_tail(&dev->knode_class, &dev->class->p->class_devices);
					
					list_for_each_entry(class_intf, &dev->class->p->class_interfaces, node)
					
					if (class_intf->add_dev)
						class_intf->add_dev(dev, class_intf);

参考文章
五、2sysfs API总结   博客好好学习一下
https://blog.csdn.net/qq_20678703/article/details/52670871

六 设备驱动模型-总线
https://blog.csdn.net/qq_20678703/article/details/52688958

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux常见驱动源码分析(kernel hacker修炼之道)--李万鹏 李万鹏 IBM Linux Technology Center kernel team 驱动资料清单内容如下: Linux设备模型(中)之上层容器.pdf Linux设备模型(上)之底层模型.pdf Linux驱动修炼之道-驱动中一些常见的宏.pdf Linux驱动修炼之道-内存映射.pdf Linux驱动修炼之道-看门狗框架源码分析.pdf Linux驱动修炼之道-触摸屏驱动之s3c2410_ts源码分析.pdf Linux驱动修炼之道-SPI驱动框架源码分析(中).pdf Linux驱动修炼之道-SPI驱动框架源码分析(下).pdf Linux驱动修炼之道-SPI驱动框架源码分析(上).pdf Linux驱动修炼之道-RTC子系统框架与源码分析.pdf Linux驱动修炼之道-platform.pdf Linux驱动修炼之道-LCD背光与gpio控制.pdf Linux驱动修炼之道-INPUT子系统(下).pdf Linux驱动修炼之道-INPUT子系统(上).pdf Linux驱动修炼之道-framebuffer(中).pdf Linux驱动修炼之道-framebuffer(下).pdf Linux驱动修炼之道-framebuffer(上).pdf Linux驱动修炼之道-DMA框架源码分析(下).pdf Linux驱动修炼之道-DMA框架源码分析(上).pdf Linux驱动修炼之道-DM9000A网卡驱动框架源码分析(中).pdf Linux驱动修炼之道-DM9000A网卡驱动框架源码分析(下).pdf Linux驱动修炼之道-DM9000A网卡驱动框架源码分析(上).pdf Linux驱动修炼之道-clock框架.pdf Linux驱动修炼之道-ADC驱动.pdf Linux内核访问外设I O资源的方式.pdf LINUX内核USB子系统学习笔记之初识USB.pdf kernel hacker修炼之道之驱动-流水灯.pdf kernel hacker修炼之道之驱动-混杂设备.pdf kernel hacker修炼之道之驱动-按键.pdf kernel hacker修炼之道之PCI subsystem(五).pdf kernel hacker修炼之道之PCI subsystem(四).pdf kernel hacker修炼之道之PCI subsystem(三).pdf kernel hacker修炼之道之PCI subsystem(六).pdf kernel hacker修炼之道之PCI subsystem(二).pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值