Linux驱动3_总线设备(二)

#include <linux/init.h>
#include <linux/module.h>
#include "simple.h"
//	在虚拟总线simple bus上边添加一个设备,并添加其驱动
int probe (struct simple_device *dev)
{
	printk(KERN_ALERT "simple_device probe.\n");
	return 0;
}
//	simple bus上的设备
struct simple_device device =
{
	.name = "simpledev",
	.class_id = {.class_id = 0x10},
};

struct simple_class_id class_id[] =
{
	{.class_id = 0x10},
	{.class_id = SIMPLE_CLASS_END}
};
//	simple bus上设备的驱动
struct simple_driver driver = {
	.name = "simpledrv",
	.classes = class_id,
	.probe = probe,
};

static int __init simple_init(void)
{
	int ret = 0;
	//向总线注册设备
    if ((ret = simple_register_device(&device)))
    {
    	printk(KERN_ALERT "simple_register_device failed.\n");
    	goto err_reg_dev;
    }
    //向总线注册驱动
    if ((ret = simple_register_driver(&driver)))
    {
    	printk(KERN_ALERT "simple_register_driver failed.\n");
    	goto err_reg_drv;
    }
	return ret;
err_reg_drv:
	simple_unregister_device(&device);
err_reg_dev:
	return ret;
}

static void __exit simple_exit(void)
{
	simple_unregister_driver(&driver);
	simple_unregister_device(&device);
}
module_init(simple_init);
module_exit(simple_exit);
MODULE_LICENSE("GPL");
时间: 2024-08-02 23:06:12

Linux驱动3_总线设备(二)的相关文章

Linux驱动2_总线设备(一)

// 参考 Linux设备驱动程序(lld3) // 实现一个简单的虚拟总线 simple bus // simple_bus_type为总线类型 // simple_bus为总线设备 // // simple.c 实现 #include "simple.h" // 增加设备引用计数 static struct simple_device *simple_dev_get(struct simple_device *dev) { if (dev) get_device(&dev-

【Linux驱动】字符设备驱动

一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 2.块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备

linux驱动开发--字符设备:自动创建设备节点

自动创建设备文件 定义在<linux/device.h>中 class结构:该结构体类型变量对应一个设备类,被创建的类存放在/sys目录下面 device结构:该结构体类型变量对应设备,被创建的设备存放于/sys目录下面 在加载驱动模块时,用户空间中的udev会自动响应device_create()函数,在/sys下寻找对应的类,从而为这个设备在/dev目录下创建设备文件 内核版本问题: 在内核2.4版本中使用devfs_register 在内核2.6早起版本中使用class_device_r

linux驱动开发--字符设备:静态分配设备号

字符设备(char device)         采用字节流方式访问的设备称为字符设备,通常智能采用顺序访问方式,也有极少数可以前后移动访问指针的设备(如:帧捕捉卡等设备).系统标准字符设备,例如:字符中断.串口等设备.常见待开发设备驱动的字符设备,例如:触摸屏.键盘.视频捕捉设备.音频设备等. 设备号 主设备号     用于标识设备类型,内核代码根据该号码对应设备文件和对应的设备驱动程序 次设备号     用于标识通类型的不同设备个体,驱动程序根据该号码辨别具体操作的是哪个设备个体. 设备号

linux驱动开发--字符设备:动态分配设备号

设备号的动态分配 int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);dev:保存分配到的设备号baseminor:希望分配的起始次设备号count:需要分配的设备号数目name:设备名称(出现在/proc/devices)         返回:成功返回0, 失败返回负值 请求内核动态分配count个设备号,且次设备号从baseminor开始 /** *Copyrig

linux驱动开发--字符设备:通过cdd_cdev结构中的led变量区分是哪个节点,private_data使用

private_data改进 为设备驱动支持多个设备个体做准备,针对private_data进行改进 在设备打开操作中通过inode中保存的i_cdev获取代表当前设备的cdev对象 通过代表当前设备的cdev对象得到包含该对象的设备私有数据结构体 将设备私有数据结构体指针保存到struct file的private_data成员中 在其它设备操作中直接使用保存在struct file的private_date成员中的当前设备私有数据结构体 /** *Copyright (c) 2013.Tia

linux驱动开发--字符设备:简单的file_operations示例

字符设备结构struct cdev 内核使用该结构来表示一个字符设备,在<linux/cdev.h>中定义. 重要成员: struct kobject kobj;//设备对象 struct module *owner;//该设备的拥有者驱动模块 struct file_operations *ops;//设备操作集合 struct list_head list;//内核维护的字符设备链表成员 dev_t dev;//字符设备号 unsigned int count;//设备个数 文件结构 st

linux驱动开发--字符设备:原子操作

解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问是指一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问. 访问共享资源的代码区域称谓临界区(critical sections),临界区需要以某种互斥机制加以保护.中断屏蔽.原子操作.自旋锁和信号量是Linux设备驱动中可采用的互斥途径. 原子操作 原子操作指的是在执行过程中不会被别的代码路径所中断的操作. Linux内核停工了一系列函数来实现内核中的原子操作.这些函数分为两类,分别针对位和整型变量进行原子操作.他们的共同点是在任

linux驱动开发--字符设备:创建一组设备节点

cdev改进 为设备驱动支持多个设备个体做准备,针对cdev进行改进 将代表字符设备的cdev对象包含在设备驱动定义的私有数据结构体中 对设备驱动私有数据结构体采用内核内存分配方式为其分配内存 将为每个设备添加cdev对象和创建设备节点封装为一个独立函数 支持多个设备个体 为设备驱动支持多个设备个体对驱动进行改进 循环调用为每个设备添加cdev对象和创建设备节点而封装的独立函数实现在系统中添加对多个设备个体的支持 /** *Copyright (c) 2013.TianYuan *All rig