文章目录
1.printk
打印等级
#define KERN_EMERG "0" /* system is unusable */
#define KERN_ALERT "1" /* action must be taken immediately */
#define KERN_CRIT "2" /* critical conditions */
#define KERN_ERR "3" /* error conditions */
#define KERN_WARNING "4" /* warning conditions */
#define KERN_NOTICE "5" /* normal but significant condition */
#define KERN_INFO "6" /* informational */
#define KERN_DEBUG "7" /* debug-level messages */
其它用法和printf一样,可以利用打印等级区分错误信息
2.module_param
module_param(name, type, perm)
功能:接收命令行传递的参数
参数:
@name:变量名
@type:变量的类型
/* Standard types are:
* byte, hexint, short, ushort, int, uint, long, ulong
* charp: a character pointer
* bool: a bool, values 0/1, y/n, Y/N.
* invbool: the above, only sense-reversed (N = true). */
@perm:权限 权限的最大值0664,用户与组全部归属于root用户
在 /sys/module/驱动名字/parameters/目录下创建一个名字为 变量名 的文件,此文件的权限为 type
3.MODULE_PARM_DESC
MODULE_PARM_DESC(_parm, desc)
功能:对传递的参数进行描述,可以通过modinfo命令查看这个描述字段
参数:
@_parm:变量名
@desc:描述字段
4.EXPORT_SYMBOL_GPL
EXPORT_SYMBOL_GPL(x)
功能:导出符号表
参数:
@x:函数名/变量名
5.register_chrdev
int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
#include <linux/fs.h>
功能:创建字符设备驱动
参数:
@major:主设备号 (一次创建256个设备号,主设备号+[0-255])
major > 0 :静态指定主设备号
major = 0 :动态申请主设备号
@name:驱动的名字
linux@ubuntu:/dev/input$ cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
| |
主设备号 驱动的名字
@fops:操作方法结构体
struct file_operations {
int (*open) (struct inode *, struct file *);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
int (*release) (struct inode *, struct file *);
}
返回值:成功取决于第一个参数
major > 0 :成功返回0
major = 0 :成功返回的是主设备号
失败返回错误码
6.unregister_chrdev
#include <linux/fs.h>
void unregister_chrdev(unsigned int major, const char *name)
功能:销毁字符设备驱动
参数:
@major:主设备号
@name:驱动的名字
返回值:无
7.copy_to_user
#include <linux/uaccess.h>
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n)
功能:从内核空间向用户空间拷贝数据(驱动的read函数中)
参数:
@to:用户空间的地址
@from:内核空间的地址
@n:拷贝的字节的个数
返回值:成功返回0,失败返回未拷贝的字节的个数
8.copy_from_user
#include <linux/uaccess.h>
unsigned long copy_from_user(void *to, const void __user *from, unsigned long n)
功能:从用户空间向内核空间拷贝数据(驱动的write函数中)
参数:
@to:内核空间的地址
@from:用户空间的地址
@n:拷贝的字节的个数
返回值:成功返回0,失败返回未拷贝的字节的个数
9.ioremap
#include <linux/io.h>
void *ioremap(unsigned long phy_addr, unsigned long size)
功能:地址映射
参数:
@phy_addr:虚拟地址
@size:映射的大小,单位是字节
返回值:成功返回虚拟地址,失败返回NULL
10.iounmap
void iounmap(volatile void *addr)
功能:取消地址映射
参数:
@addr:虚拟地址
返回值:无
11.writel
writel(v,r)
功能:向寄存器中写(32bit) 数据
参数:
@v:写的值
@r:寄存器地址
12.readl
readl(r)
功能:读取寄存器中的数据
参数:
@r:寄存器地址
13.class_create
struct class * class_create(owner, name)
功能:向上层提交目录名
参数:
@owner:THIS_MODULE (编译器相关的宏)
@name:目录名 在/sys/class下
返回值:成功返回cls的结构体指针,失败返回错误码指针
eg:
struct class *cls = class_create(THIS_MODULE,"hello");
if(IS_ERR(cls)){ //进入if语句就是错误
printk("class create error\n");
return PTR_ERR(cls); //将错误码指针转换为错误码
}
14.device_create
struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char *fmt, ...)
功能:向上层提交设备信息
参数:
@class:cls的指针
@parent:一般NULL
@devt:设备号
@drvdata:写为NULL
@fmt,...:可变参数,节点名
返回值:成功返回dev的指针,失败返回错误码指针
15.class_destroy
void class_destroy(struct class *cls)
功能:销毁目录
参数:
@cls:目录的指针
返回值:无
16.device_destroy
void device_destroy(struct class *class, dev_t devt)
功能:销毁设备信息
参数:
@class:目录的指针
@devt:设备号
返回值:无
本文含有隐藏内容,请 开通VIP 后查看