Skip to main content

通用模块驱动使用

1. GPIO SPI总线驱动

Iconfig配置

1

编译完成会在module_driver/output生成 spi_gpio_add.ko和 spi_gpio_add.sh 安装脚本,运行

这个安装脚本可实现spi_gpio驱动的安装。

可以在spi_gpio_add.sh脚本中对以上这些参数重新进行配置,下面列举脚本中的参数。

bus_num spi总线编号(要保证其唯一性)

sck 时钟信号引脚

mosi 数据输出引脚

miso 数据输入引脚

num_chipselect 最大的从设备数量

2. SPI设备驱动

Iconfig配置

2

3. GPIO I2C驱动

Iconfig配置

3

编译完成会在module_driver/output/目录生成i2c_gpio_add.ko和 i2c_gpio_add.sh 安装脚本,

运行这个安装脚本可实现gpio i2c驱动的安装。

可以在i2c_gpio_add.sh脚本中对以上这些参数重新进行配置,下面列举脚本中的参数。

bus_num i2c总线编号

rate i2c速率

scl 时钟引脚

sda 数据引脚

4. utils基础实用工具集

4.1 Iconfig配置

4

4.2 导出API说明

utils工具相关源代码目录在module_driver/drivers/utils下面

4.2.1 string相关导出API

int stricmp(const char *s1, const char *s2) 

功能:忽略大小写,判断字符串是否相同

参数:const char *s1 需要比较的字符串

const char *s2

返回值:0 表示两个字符串相同

0 表示表示不相同
int strimatch(const char *s1, const char *prefix) 

功能:判断字符串 "s1" 是否带有前缀 "prefix"

参数:const char *s1 需要判断的字符串

const char *prefix 需要判断的前缀

返回值:0 表示字符串s1带有前缀prefix

0 表示不带有前缀prefix
char *str_first_space(const char *s) 

功能:得到字符串s第一个space的地址,并返回

参数:const char *s 目标字符串

返回值: 字符串s中第一个space的地址(即返回的字符串会将空格之前的字符删除)
char *str_first_not_space(const char *s) 

功能:得到字符串s第一个非space的地址,并返回

参数:const char *s 目标字符串

返回值:字符串s中第一个非space的地址(即返回的字符串会将第一个非空格字符,之前的空格删除)
char *str_first_tail_space(const char *s) 

功能:尾部的连续space的起始地址,并返回

参数:const char *s 目标字符串

返回值:字符串s尾部的连续space的起始地址(即返回的字符串,会将连续space之前的字符全部删除)

注意:如果该字符串s尾部没有space,那么返回的是该字符串结束符'\0'的地址,

可以利用这个特性来判断尾部是否有space
char *strip(const char *s, const char **right_p) 

功能:指明首部第一个非space的地址,和尾部连续的space的起始地址。

参数:const char *s 目标字符串

const char **right_p 会被赋值尾部的连续space的起始地址

(相当于right_p = str_first_tail_space(s))

返回值:字符串s第一个非space的地址(相当于return str_first_not_space(s))
char **str_to_words(const char *str, int *word_count) 

功能:将字符串转换为 word

参数:const char *str 输入的字符串

int *word_count 返回 word 的个数,可以为NULL

返回值:words[count+1] 字符串数组, 数组的成员按顺序存放每个 word, words[count]NULL

示结束

注意:返回值需要调用 str_free_words() 释放

支持 "... ..." 以及 '... ...' 类型的word(即有空格的要用""''括起来)

其中只有""支持转义符
int strtol_h(const char *str, long *res) 

功能:将字符串转换为数字,类型为long,可以支持单位为 k/K m/M(例如将"1K"可转化成1000)

参数:const char *str 待转换的字符串

long *res 返回转换的值,如果转换成功

放回值:0 转换成功 -ERANGE 超出范围 -EINVAL 转换失败
int strtoul_h(const char *str, unsigned long *res) 

功能:将字符串转换为数字,类型为unsigned long,可以支持单位为 k/K m/M(例如将"1M"可转化成

1000 000)

参数:const char *str 待转换的字符串

long *res 如果转换成功,返回转换的值

返回值:0 转换成功 -ERANGE 超出范围 -EINVAL 转换失败

4.2.2 gpio相关导出API

int gpio_port_set_func(int port, unsigned long pins, enum gpio_function func) 

功能:设置gpio port 中部分引脚的 func

参数:int port 0:PA 1:PB ,,,

unsigned long pins 用bit来表示port 对应的某些pin脚

enum gpio_function func 参见不同平台的定义

返回值:0 表示成功
int gpio_set_func(int gpio, enum gpio_function func) 

功能:设置gpio功能

参数:int gpio 要设置功能的gpio

enum gpio_function func 参见不同平台的定义

返回值:0 表示成功
int str_to_gpio(const char *str) 

功能:字符串 转 gpio

参数:const char *str 要转换的字符串

返回值: 如果转换成功 则返回gpio

如果转换失败 -EINVAL

如果 str 是 “-1” 则返回 -1-1 一般表示gpio未定义

注意: 字符串形式如下所示,不限大小写

gpio_pXN, gpio_pXNN, pXN, pXNN

X: a,b,c,d,e,f,g

N: 0,1,2,3,4,5,6,7,8,9

例如: gpio_pa02 GPIO_PA02 gpio_pa2 PA02 pa02 pa2
char *gpio_to_str(int gpio, char *buf) 

功能:gpio 转 字符串

参数:int gpio 要转换的gpio

char *buf 存放转换完成的字符串数组,是如果buf为NULL,那么会调用kmalloc分配一个(需要

用户kfree)

返回值:返回gpio字符串,如果buf为NULL,则返回kmalloc分配的(需要用户kfree), 如果buf不为

NULL,则返回buf
int str_match_gpio(const char **str_p) 

功能:字符串 匹配 gpio

参数:const char **str_p 要匹配的字符串

返回值: 正数 表示匹配到一个有效的gpio,str_p 里的值会被指向接下来的字符串

-1 表示匹配到 -1, -1 一般表示gpio未定义,str_p 里的值会被指向接下来的字符串

-EINVAL 没有匹配到gpio或者-1, str_p里的值不会改变

4.2.3 其他导出API

unsigned long long local_clock_us(void) 

功能: 获取本地时钟的值(us级)

返回值: 返回本地时钟的值(us级)
unsigned long long local_clock_ms(void) 

功能: 获取本地时钟的值(ms级)

返回值: 返回本地时钟的值(ms级)
struct i2c_client *i2c_register_device(struct i2c_board_info *info, int 

i2c_bus_num)

功能:向指定的i2c总线注册i2c设备
struct spi_device *spi_register_device(struct spi_board_info *info, int 

spi_bus_num)

功能:向指定的spi总线注册spi设备

注意:设备的 chip_select 变量会被自动累加无需赋值

需要提供 controller_data 变量作为cs 的gpio 引脚