Linux Kernel API
记录一些Linux Device Drivers中常用的API。
Linux官方提供的内核文档:
1、 最新版: https://www.kernel.org/doc/html/latest/
2、 4.10: https://www.kernel.org/doc/html/v4.10/
3、 Understanding the Linux Virtual Memory Manager 或者查看PDF版本
一、内存分配
1. void *devm_kmalloc(struct device *dev, size_t size, gfp_t gfp)
2、 void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp)
3、 void devm_kfree(struct device *dev, void *p)
4、 struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num)
5、 int platform_get_irq(struct platform_device *dev, unsigned int num)
6、 struct resource *platform_get_resource_byname(struct platform_device *dev, unsigned int type, const char *name)
7、 int platform_get_irq_byname(struct platform_device *dev, const char *name)
示例(4、5、6、7几个API的调用):
设备树:
reg = <0x15240000 0x2c000>,
<0x15204000 0x20000>;
reg-names = "slimbus_physical", "slimbus_bam_physical";
interrupts = < >, < >;
interrupt-names = "slimbus_irq", "slimbus_bam_irq"; 驱动: struct resource *bam_mem;
struct resource *slim_mem;
struct resource *irq, *bam_irq; slim_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
"slimbus_physical");
等价于: platform_get_resource(pdev, IORESOURCE_MEM, ) bam_mem = platform_get_resource_byname(pdev, IORESOURCE_MEM,
"slimbus_bam_physical");
等价于: platform_get_resource(pdev, IORESOURCE_MEM, ) irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
"slimbus_irq");
等价于: platform_get_resource(pdev, IORESOURCE_IRQ, ) bam_irq = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
"slimbus_bam_irq");
等价于: platform_get_resource(pdev, IORESOURCE_IRQ, )
8、 char *kstrdup(const char *s, gfp_t gfp);
功能: 分配一块内存空间(kmalloc + gfp),然后将s指向的字符串拷贝到这块内存中并返回该内存的首地址
9、void *kmemdup(const void *src, size_t len, gfp_t gfp);
功能:分配一块长度为len的内存(kmalloc+gfp),然后将src到(src + len)内存的内容copy到新分配的内存中,然后返回该内存的首地址
10、void *memdup_user(const void __user *src, size_t len);
功能: 分配一块长度为len的内存(kmalloc + gfp),然后将用户空间的地址src到(src+len)范围的内存使用copy_from_user的方式拷贝到
新分配的内存当中,最后返回新分配的内存的首地址
二、GPIO相关
1、static inline int of_get_named_gpio(struct device_node *np, const char *propname, int index)
获得GPIO号, 失败的话,会返回负数, 可以用gpio_is_valid来检查解析到的gpio是否合法:
设备树:
qcom,cdc-us-euro-gpios = <&tlmm > 驱动:
pdata->us_euro_gpio = of_get_named_gpio(pdev->dev.of_node,
"qcom,cdc-us-euro-gpios", );
2、 int of_get_gpio(struct device_node *np, int index)
从设备树的gpios属性中解析出第index个gpio资源:
设备树:
gpios = <&gpf1 GPIO_ACTIVE_HIGH>, <&gpf1 GPIO_ACTIVE_HIGH>;
驱动:
int sda_pin, scl_pin; sda_pin = of_get_gpio(np, );
scl_pin = of_get_gpio(np, );
of_get_gpio
三、端口映射
1、void __iomem *devm_ioremap_resource(struct device *dev, struct resource *res)
示例:
2、 void devm_iounmap(struct device *dev, void __iomem *addr)
3、 void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, resource_size_t size)
4、 void __iomem *of_iomap(struct device_node *np, int index)
5、void __iomem *of_io_request_and_map(struct device_node *np, int index, const char *name)
四、设备树相关
1. bool of_property_read_bool(const struct device_node *np, const char *propname)
如果存在该属性,那么返回true,否则返回false
2. int of_property_read_u8(const struct device_node *np, const char *propname, u8 *out_value)
读取一个unsigned char, 成功返回0, 失败的话返回负数
这里需要注意的是: 设备树中对应的属性是 property_name = /bits/ 8 <0x50>
3. int of_property_read_u16(const struct device_node *np, const char *propname, u16 *out_value)
读取一个unsigned short, 成功返回0, 失败的话返回负数
这里需要注意的是: 设备树中对应的属性是 property = /bits/ 16 <0x5000 0x6000 0x7000>
4. int of_property_read_u32(const struct device_node *np, const char *propname, u32 *out_value)
读取一个unsigned int, 成功返回0, 失败的话返回负数
5、const struct of_device_id *of_match_node(const struct of_device_id *matches, const struct device_node *node)
返回matches中跟node相匹配的那一项, 如:
设备树如下:
sound {
status = "okay";
compatible = "qcom,sdm660-asoc-snd";
... ...
} 驱动如下:
static const struct of_device_id sdm660_asoc_machine_of_match[] = {
{ .compatible = "qcom,sdm660-asoc-snd",
.data = "internal_codec"},
{ .compatible = "qcom,sdm660-asoc-snd-tasha",
.data = "tasha_codec"},
{ .compatible = "qcom,sdm660-asoc-snd-tavil",
.data = "tavil_codec"},
{},
}; static int msm_asoc_machine_probe(struct platform_device *pdev)
{
const struct of_device_id *match; match = of_match_node(sdm660_asoc_machine_of_match,
pdev->dev.of_node);
... ...
} static struct platform_driver sdm660_asoc_machine_driver = {
.driver = {
......
.of_match_table = sdm660_asoc_machine_of_match,
},
......
};
module_platform_driver(sdm660_asoc_machine_driver);
6、 struct device_node *of_parse_phandle(const struct device_node *np, const char *phandle_name, int index)
根据一个handle property解析得到对应的device node, 如:
设备树:
sound {
status = "okay";
compatible = "qcom,sdm660-asoc-snd";
... ...
qcom,us-euro-gpios = <0x1b4>;
... ...
};
msm_cdc_pinctrl@ {
compatible = "qcom,msm-cdc-pinctrl";
... ...
linux,phandle = <0x1b4>;
phandle = <0x1b4>;
};
驱动:
struct device_node *node;
node = of_parse_phandle(pdev->dev.of_node,
"qcom,us-euro-gpios", );
五、中断
内核中其他一些不常见的用法示例:
完。
Linux Kernel API的更多相关文章
- linux kernel API and google android compile guide
(1)linux kernel API website: http://docs.knobbits.org/local/linux-doc/html/regulator/index.html http ...
- Linux kernel API的查看
一般来说Linux上查看一些函数API的说明咱们可以man一下.man 2是syscall,man 3是一些库的函数API. 以下是man sections的一些说明 The table below ...
- Linux kernel的中断子系统之(五):驱动申请中断API
返回目录:<ARM-Linux中断系统>. 总结:二重点区分了抢占式内核和非抢占式内核的区别:抢占式内核可以在内核空间进行抢占,通过对中断处理进行线程化可以提高Linux内核实时性. 三介 ...
- Linux kernel中断子系统之(五):驱动申请中断API【转】
转自:http://www.wowotech.net/linux_kenrel/request_threaded_irq.html 一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的 ...
- Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State
目录 . 引言 . Linux 中断的概念 . 中断处理流程 . Linux 中断相关的源代码分析 . Linux 硬件中断 . Linux 软中断 . 中断优先级 . CPU在关中断状态下编程要注意 ...
- Linux Kernel(Android) 加密算法汇总(三)-应用程序调用内核加密算法接口
于Linux Kernel(Android) 加密算法总结(cipher.compress.digest)文章中.介绍了怎样在内核中增加三种不同类型的内核加密算法, 并给出了在内核模块中怎样调用他们的 ...
- 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介
作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介 1. 内核功能简介 ...
- Linux kernel的中断子系统之(一):综述
返回目录:<ARM-Linux中断系统>. 总结: 一从作为一名驱动工程师角度看,用好中断需要正确认识request_threaded_irq/request_irq关系.中断临界区保护. ...
- Linux kernel的中断子系统之(三):IRQ number和中断描述符
返回目录:<ARM-Linux中断系统>. 总结: 二描述了中断处理示意图,以及关中断.开中断,和IRQ number重要概念. 三介绍了三个重要的结构体,irq_desc.irq_dat ...
随机推荐
- UICollectionView的常用方法
class UICollectionView : UIScrollView //初始化,位置,风格 init(frame: CGRect, collectionViewLayout layout: U ...
- seafile+glusterfs 安装部署
今天在虚拟机上搭一下seafile,用于测试环境.此处安装的是社区免费版本的,可以使用一键自动安装(MySQL适用). 官方文档:https://manual-cn.seafile.com/ 1.一键 ...
- redis 配置文件配置
redis的配置和使用 redis的配置的分段的 配置段: 基本配置项 网络配置项 持久化相关配置 复制相关的配置 安全相关配置 Limit相关的配置 SlowLog相关的配置 INCLUDES Ad ...
- BZOJ2178 圆的面积并 计算几何 辛普森积分
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2178.html 题目传送门 - BZOJ2178 题意 给出 $n(n\leq 1000)$ 个圆,求 ...
- 51Nod1626 B君的梦境 状压dp 矩阵
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1626.html 题目传送门 - 51Nod1626 题意 题解 首先考虑形象的想象本题中的思维空间. ...
- C#基础:委托之Action<T>和Func<T>的用法
- jstl select <c:if test下拉菜单不能被选中!
关于select下拉菜单中出现中文时,因为编码的问题,不能用“==”来进行判断,必须要用“eq”,而且中文带上单引号: <select id="operateType" na ...
- scrapy response.xpath可以提取包含字符XX的标签
1. 筛选属性包含某字符串的标签(如id = 'bigbaong' 查询包含'big'字符的就可以筛选到) res = response.xpath("//a[contains(@id, ...
- HDU 1175 连连看 (DFS+剪枝)
<题目链接> 题目大意:在一个棋盘上给定一个起点和终点,判断这两点是否能通过连线连起来,规定这个连线不能穿过其它的棋子,并且连线转弯不能超过2次. 解题分析:就是DFS从起点开始搜索,只不 ...
- HDU 3829 Cat VS Dog (最大独立集)【二分图匹配】
<题目链接> 题目大意: 动物园有n条狗.m头猫.p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物.如今动物园要转移一些动物.假设一个小孩喜欢的动物在,不喜欢的动物不在,他就会happy. ...