技术专栏
Linux驱动开发常用接口
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);
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
点赞
收藏
评论
打赏
- 分享
- 举报
评论
0个
手气红包
暂无数据
相关专栏
-
浏览量:1724次2023-05-16 15:43:05
-
浏览量:2309次2020-08-18 20:05:11
-
浏览量:1364次2023-05-16 14:10:29
-
浏览量:1505次2019-11-20 09:10:33
-
浏览量:2130次2020-08-04 20:32:16
-
浏览量:2554次2023-11-10 15:46:07
-
浏览量:625次2023-08-14 17:53:58
-
浏览量:761次2023-12-25 14:23:01
-
浏览量:634次2023-12-21 16:28:56
-
浏览量:8184次2022-10-17 11:49:55
-
浏览量:16535次2021-02-19 17:01:32
-
浏览量:11988次2021-02-19 16:56:03
-
浏览量:2566次2024-01-25 15:00:06
-
浏览量:1280次2024-03-19 11:42:03
-
浏览量:817次2024-05-27 15:28:18
-
浏览量:2930次2017-12-02 21:41:08
-
浏览量:3832次2020-07-17 16:50:14
-
浏览量:1443次2024-03-16 10:01:36
-
浏览量:607次2023-08-22 13:38:20
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者
cxcc
您的支持将鼓励我继续创作!
打赏金额:
¥1
¥5
¥10
¥50
¥100
支付方式:
微信支付
打赏成功!
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注