Linux常用函数:
1.alloc_chrdev_region
是一个函数语句,头文件是<linux/fs.h>,可以动态分配设备编号。
该函数需要传递给它指定的第一个次设备号firstminor(一般为0)和要分配的设备数count,以及设备名,调用该函数后自动分配得到的设备号保存在dev中。
int alloc_chrdev_region(dev_t *dev,unsigned int -firstminor,unsigned int -count,char *name);
2.class_create宏
创建一个class
#define class_create(owner, name)
- owner:一般设置为THIS_MODULE
- name:kobject对象的名字
3.cdev_init
把用户自己定义的file_operations结构体存放到cdev机构体里的file_operaions的设备驱动接口中
cdev_init(struct cdev *cdev, const struct file_operations *fops)
4.of_get_next_child
函数用迭代的查找子节点,函数原型如下
struct device_node *of_get_next_child(const struct device_node *node,
struct device_node *prev)
5.platform_device_register()
平台设备注册
resources结构体
描述驱动的硬件资源
- start:资源的开始值
- end:资源的结束值
- flasg:资源的类型
- IORESOURCE_MEM:内存地址
- IORESOURCE_IO:IO端口
- IORESOURCE_DMA:DMA传输
- IORESOURCE_IRQ:中断
5.of_iomap()—reg属性内存映射
将reg属性值的物理地址转化为虚拟地址
void __iomem *of_iomap(struct device_node *np,
int index)
参数:
- np:device_node表示的节点
- index:通常情况下reg属性包含多段,index 用于指定映射那一段,标号从0开始。
6.copy_from_user–拷贝数据
include/linux/uaccess.h
从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0.
copy_from_user(void *to, const void __user *from, unsigned long n)
参数:
-
*to:将数据拷贝到内核的地址
-
*from 需要拷贝数据的用户空间地址
-
n 拷贝数据的长度(字节)
返回值:
失败:没有被拷贝的字节数
成功:0
7.copy_to_user
将读取到的数据拷贝到用户空间
copy_to_user(void __user *to, const void *from, unsigned long n)
To 目标地址,这个地址是用户空间的地址;
From 源地址,这个地址是内核空间的地址;
N 将要拷贝的数据的字节数。
8.readl()/ writel()—虚拟地址读写
虚拟地址读写
readl()/ writel() //过时
void iowrite32(u32 b, void __iomem *addr) //写入一个双字(32bit)
unsigned int ioread32(void __iomem *addr) //读取一个双字(32bit)
9.device_create()—在class下添加kobject对象
include/linux/device.h
device_create()函数
struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char *fmt, ...)
-
class:新构建的class
-
parent:新kobject对象的上一层节点,一般为NULL
-
dev_t:属性文件记录该设备号
-
drvdata:私有数据,一般为NULL
-
fmt:变参参数,一般用来设置kobject对象的名字
10.kstrtouint—字符串转整形函数
kstrtouint函数定义在文件kstrtox.c中,原形如下:
int kstrtouint(const char *s, unsigned int base, unsigned int *res)
s是输入字符串,base可以是10(10进制)或16(16进制),或者是0自动识别,res存放转换后的整形值.
当没有错误时返回值是0;
例:
kstrtoint(receive_data, 16, &write_data);
11.i2c_add_driver
I2C的设备驱动是通过i2c_add_driver(&my_driver)向i2c-core注册的,my_driver中的核心是detach和attach函数,在attach中通过probe探测到总线上的设备并把设备和 驱动建立连接以完成设备的初始化。
i2c_add_driver(&my_driver)
12.register_chrdev_region()
register_chrdev_region(dev_t first,unsigned int count,char *name)
First :要分配的设备编号范围的初始值(次设备号常设为0);
Count:连续编号范围.
Name:编号相关联的设备名称. (/proc/devices)
13.alloc_chrdev_region
动态分配:
Int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);
Firstminor : 通常为0;
*dev:存放返回的设备号;