Linux驱动开发常用接口

Linux驱动开发常用接口 cxcc 2023-05-06 14:05:23 917

Linux驱动开发常用接口

注册驱动模块

//fun的参数列表为空,返回值为int
module_init(fun_init);
module_exit(fun_exit);
//其它声明
//[必须]开源声明
MODULE_LICENSE("GPL");
//作者
MODULE_AUTHOR("cxcc");
//描述
MODULE_DESCRIPTION("read and write test module");

输出操作

printk(输出等级 "fmt",...);

输出等级

#define KERN_EMERG  KERN_SOH "0"    /* system is unusable */
#define KERN_ALERT  KERN_SOH "1"    /* action must be taken immediately */
#define KERN_CRIT   KERN_SOH "2"    /* critical conditions */
#define KERN_ERR    KERN_SOH "3"    /* error conditions */
#define KERN_WARNING    KERN_SOH "4"    /* warning conditions */
#define KERN_NOTICE KERN_SOH "5"    /* normal but significant condition */
#define KERN_INFO   KERN_SOH "6"    /* informational */
#define KERN_DEBUG  KERN_SOH "7"    /* debug-level messages */

如果输出等级高于控制台等级,就会在控制台输出该消息,否则只能在dmesg中查看

cdev操作

//将设备添加到系统中
//参数:
//  p:要添加到系统中的cdev
//  dev:设备号
//  count:添加到系统中的设备个数
int cdev_add(struct cdev *p, dev_t dev,unsigned count);
//将设备从系统中删除
//参数:
//  p:设备cdev
void cdev_del(struct cdev *p);
//关联cdev与操作接口
//参数:
//  cdev:设备信息结构体
//  fops:操作接口
void cdev_init(struct cdev *cdev, const struct file_operations *fops);
//调用函数直接返回一个可用cdev首地址
struct cdev *cdev_alloc(void);

创建设备

手动

#使用mknod 创建设备
#设备类型使用c表示字符设备,使用b表示块设备
sudo mknod [设备路径]   [设备类型(c/b)] [主设备号]  [次设备号]
#例如:创建字符设备/dev/rw_dev0 设备号为[504:0]
sudo mknod /dev/rw_dev0 c 504 0

自动

//注册设备class
//该函数为宏函数,下面列出的不是函数声明,仅是以函数声明的形式列出输入和输出的类型
//参数:
//  owner:一般使用THIS_MOUDLE
//  name:模块名字符串
//返回值:
//  设备class
struct class * class_create(struct module *owner,const char* name);
//注销设备class
//参数:
//  cls:设备class
void class_destroy(struct class *cls);

//创建设备文件
//参数:
//  class:设备class
//  parent:设备的父节点,若没有则置空(NULL)
//  devt:设备号
//  drvdata:传递参数使用(暂时不会用)
//  fmt:设备名,该参数和后续的参数可以像print一样使用,即可以使用占位符进行格式化输出
struct device *device_create(
        struct class *class, 
        struct device *parent,
        dev_t devt, 
        void *drvdata, 
        const char *fmt, ...);
//删除设备
//参数:
//  class:设备class
//  devt:设备号
void device_destroy(struct class *class, dev_t devt)

设备号操作

//静态申请设备号
//参数:
//  from:要申请的设备号
//  count:要申请的次设备号的个数(申请出的次设备号连续,起始值是第一个参数中的次设备号)
//  name:驱动名(参考其他书写的是设备名称,但是这个名称和实际的设备名称好像并没有什么关系)
//       在/proc/devices目录中可查
//返回值:返回0表示申请成功,否则返回错误码
int register_chrdev_region(dev_t from, unsigned count, const char *name);
//动态申请设备号
//参数:
//  dev:[output]要存放设备号的结构体地址
//  baseminor:起始设备号
//  count:要申请的次设备号的个数(申请出的次设备号连续)
//  name:驱动名(参考其他书写的是设备名称,但是这个名称和实际的设备名称好像并没有什么关系)
//       在/proc/devices目录中可查
//返回值:返回0表示申请成功,否则返回错误码
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char* name);
//释放设备号
//参数:
//  from:要释放的设备号
//  count:子设备号个数
void unregister_chrdev_region(dev_t from, unsigned count);

数据拷贝

//__user 标识是用户的缓冲区
//n 拷贝的数据长度

//从用户内存拷贝到内核内存
static inline long copy_from_user(void *to, const void __user * from, unsigned long n);
//从内核内存拷贝到用户内存
static inline long copy_to_user(void __user *to, const void *from, unsigned long n);
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
cxcc
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
cxcc
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区