驱动开发-字符设备1

字符设备驱动1

  • vi X86_64-linux-gnu/asm/unistd.h
函数的调用
open
SYSCALL_DEFINE3()
sys_open(char *filename,inflag)
do_sys_open()
do_file_open()
path_openat
do_tmpfile \return fd
finish_open
do_dentry_open
open = inode->fops->open

1. open用户空间调用软中断时会产生一个软中断
- 查看软中断号
cd /usr/include/i386-linux-gnu/asm/unistd_32.h
13 __NR_open 5

2.
- cd

/usr/include/asm-generic/unistd.h
707 #define __NR_OPEN 1024 __SYSCALL(__NR_open,sys_open)

3.
cd /usr/include/i386-linux-gnu/bits/syscall.h

- #define SYS_open NR_open

自动分配设备号

  • alloc_chrdev_region()
    int alloc_chrdev_region(dev_t \*dev,unsigned baseminor,unsigned count,const char \*name);
    //参数
    //dev_t *dev 申请设备号
    //unsigned baseminor 申请的第一个次设备号
    //unsigned count 申请次设备号的个数
    //const char *name 设备或驱动的名字
  • ioremap()
    static inline void __iomem *ioremap(phys_add_t offset,unsiged long size)

    inline
  • iounmap()

自动创建设备结点

mdev -s -> sys/class/目录/文件 -> /dev/文件

sysfs:内核和用户交互的统一接口

cat uevent –>
ls /dev/console l

  1. 需要在class的目录下创建类名(目录的名字)
    class_create

    struct class *cls;
    class_create(THIS_MODULE,”fs4412”);

  2. 在类名下创建节点
    device_create

    1. 创建类的返回值
    2. NULL
    3. 设备号
    4. 传的数据 (void)
    5. 创建设备名

    device_create(cls,NULL,devno,NULL,”led”);

  3. 销毁设备
    void device_destory();

  4. 销毁类
    void class_destory();

.owner = THIS_MODULE //指向当前模块


次设备号的识别
1. iminor

    static inline  unsigned iminor(const struct inode *inode);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值