文章目录
- 一、IIC子系统编程
- (一)分配并初始化对象
- (二)IIC驱动框架
- (三)IIC的regmap函数
- 1. 初始化IIC的寄存器映射
- 2. 写入寄存器
- 3.读取寄存器
- (二)打印调试信息
一、IIC子系统编程
(一)分配并初始化对象
struct i2c_driver {int (*probe)(struct i2c_client *client, const struct i2c_device_id *id);void (*remove)(struct i2c_client *client);void (*shutdown)(struct i2c_client *client);struct device_driver driver;
};
(二)IIC驱动框架
int myiic_probe(struct i2c_client *client, const struct i2c_device_id *id){return 0;
}
void myiic_remove(struct i2c_client *client){}static struct i2c_driver myiic_driver = {.probe = myiic_probe,.remove = myiic_remove,.shutdown = myiic_shutdown,.driver = {.name = "myiic",.of_match_table = myiic_dt_ids,},
};module_i2c_driver(myiic_driver);
MODULE_LICENSE("GPL v2");
(三)IIC的regmap函数
1. 初始化IIC的寄存器映射
#define devm_regmap_init_i2c(i2c, config) __regmap_lockdep_wrapper(__devm_regmap_init_i2c, #config, i2c, config)
功能:初始化一个专用于IIC设备的寄存器映射
参数:@i2c:指向 struct i2c_client 的指针,表示要与之交互的 I2C 设备@config:指向remap_config结构体
返回值:成功,返回一个指向regmap的指针失败,返回一个错误码指针
备注:可以直接使用regmap的API,而无需直接操作IIC接口
寄存器映射配置信息结构体
struct regmap_config {int reg_bits;int val_bits;const struct regmap_access_table *volatile_table;enum regcache_type cache_type;...
}结构体成员 --- volatile_table
指定哪些寄存器是易变的结构体成员 --- cache_typeenum regcache_type {REGCACHE_NONE,REGCACHE_RBTREE,REGCACHE_COMPRESSED,REGCACHE_FLAT,};
2. 写入寄存器
int regmap_write(struct regmap *map, unsigned int reg, unsigned int val);
功能:将指定的值写入到硬件设备的寄存器
参数:@map:remap实例的指针@reg:要写入的寄存器的地址@val:要写入的寄存器的值
返回值:成功,返回0失败,返回错误码
备注:需要先初始化regmap实例
3.读取寄存器
int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val);
功能:读取指定寄存器的值
参数:@map:指向regmap实例的指针@reg:要读的寄存器地址@val:指向变量的指针,存储从寄存器读取的值
返回值:成功,返回0失败,返回错误码
(二)打印调试信息
dev_emerg(dev, fmt, ...)
dev_crit(dev, fmt, ...)
dev_alert(dev, fmt, ...)
dev_err(dev, fmt, ...)
dev_warn(dev, fmt, ...)
dev_notice(dev, fmt, ...)
dev_info(dev, fmt, ...)
功能:打印日志信息,日志级别从上到下优先级递减
参数:@dev:指向 struct device 的指针,用于指定日志消息关联的设备。@fmt:格式化字符串,遵循 printf 风格的格式。@...:可变参数列表,用于 fmt 字符串中的格式化。