1 自动创建设备文件创建设备文件类
#define class_create(owner, name)
设备可以有多个子设备,class_create这个宏相当于创建一
个子设备的一个父类,通过它来创建多个子设备 owner :模块本身 THIS_MODULE name : name
返回值 : struct class 类型指针, 出错:NULL,成功:有效的struct class指针
创建设备文件
struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char
*fmt, ...)
class :通过 class_create 创建的设备文件类指针 parent :父设备,一般NULL
devt :设备号,包含主设备号和次设备号 drvdata :私有数据
fmt :设备文件名
返回值:Returns &struct device pointer on success, or ERR_PTR() on error.
失败时需要用 ERR_PTR 函数判断
销毁设备文件
void device_destroy(struct class *class, dev_t devt)
class :设备文件类指针
devt :设备号,包含主设备号和次设备号
销毁设备文件类
extern void class_destroy(struct class *cls); cls :设备文件类指针
设备类查看
ls /sys/class/xxxxx
ls /dev/xxx
2 区分设备文件 struct inode {
......
dev_ti_rdev; inode结构体保存的设备号
......
void
*i_private; inode 的私有数据
}
ptintk("open device num majour : %d , min min : %d\r\n", MAJOR(pNode->i_rdev), MINOR(pNode->i_rdev)
dmesg | tail -20
3 ioctl
命令码构建,内核使用32位表达了4种信息 dir:读写,size:
ioctl第三个参数时类型所占的字节数
,type(可以做命令的一个分段,类似于使用枚举的错误码分段), nr:命令码
*0xE0000000DIR
*0x80000000DIR = WRITE
*0x40000000DIR = READ
*0x20000000DIR = NONE
* 0x3FFF0000 SIZE (overlaps NONE bit)
* 0x0000FF00 TYPE
* 0x000000FF NR (CMD)
4 互斥锁
# define mutex_init(mutex)
mutex :要初始化的锁,注意传的是 struct mutex 类型指
针
mutex_lock
mutex_unlock
5 信号量
static inline void sema_init(struct semaphore *sem, int val) sem :信号量结构体指针
val :信号量持有资源个数
down 申请资源,当没有资源时,休眠等待,不可中断 extern void down(struct semaphore *sem)
down_interruptible 申请资源,当没有资源时,休眠等待,可中
断
extern int __must_check down_interruptible(struct semaphore *sem)
up 释放资源
extern void up(struct semaphore *sem)
6 原子变量
ATOMIC_INIT(0) 初始化
atomic_dec_and_test 减1并测试,为0返回true,否则返回
false
atomic_inc 加1
7 自旋锁
spin_lock_init(&g_SpinLock); 初始化 spin_lock(&g_SpinLock); 加锁 spin_unlock(&g_SpinLock); 解锁