gzyueqian
13352868059

嵌入式学习路线笔记:教你怎么创建设备文件详解

更新时间: 2018-10-19 10:10:18来源: 西安嵌入式培训浏览量:2820

    这次小编就来给大家分享一下嵌入式应用技术里面该怎么创建设备文件,大家若是读完本篇文章后还有不清楚的地方可以咨询我们。



    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 : %drn", 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); 解锁

    想要了解更多的嵌入式应用技术那就来“撩”我们吧!

免费预约试听课