linux驱动--Regmap框架(基于lm75b温度传感器)

定义regmap结构体

struct regmap *regmap;

定义regmap_config结构体

struct regmap_config regmap_config;

定义字符设备操作集

static struct file_operations lm75_dev_fops = {
.owner = THIS_MODULE;
.open = lm75_open,
.read = lm75_read,
.write = lm75_wirte,
.release = lm75_release,
};

probe函数中初始化regmap、regmap_config

regmap_config.reg_bits = 8;
regmap_config.val_bits = 16;
regmap_config.use_single_rw = true;
regmap_config.max_register = 0x03,
regmap_config.val_format_endian = REGMAP_ENDIAN_BIG,
regmap_config.cache_type = REGCACHE_RBTREE,
regmap_config.use_single_rw = true,
regmap = regmap_init_i2c(client,&regmap_config);

由于lm75 temp寄存器数据为16位,val_bits等于16,八位以上寄存器数据需要指定大小端,val_format_endian=REGMAP_ENDIAN_BIG

字符操作集读取函数

static ssize_t lm75_read(struct file *filp,char __user *buf,size_t cnt,loff_t *off){
unsigned int read_data;
long temp_out;
s16 temp;
int ret;
int err = regmap_read(regmap,LM75_REG_TEMP, &read_data);
if (err < 0)
return err;
temp = (s16)read_data;
ret = copy_to_user(buf,&temp,sizeof(temp));
return 0;
}
读取LM75温度寄存器数据上报用户空间

总结

具体驱动程序可参考/driver/hwmon/lm75.c
MLX90614红外温度传感器_linux驱动源码,已经在产品中使用过。android 6.0 ,内核版本为3.4.39,可以做为你的学习设计参考。 #include <linux/kernel.h> #include <linux/module.h> #include <linux/miscdevice.h> #include <linux/moduleparam.h> #include <linux/delay.h> #include <linux/fs.h> #include <linux/timer.h> #include <linux/ioctl.h> #include <linux/gpio.h>//__gpio_set_value #include <mach/sys_config.h>//script_item_u #include <linux/pinctrl/consumer.h>//pin_config_set #include <linux/pinctrl/pinconf-sunxi.h>//SUNXI_PINCFG_TYPE_* #include <linux/io.h> #include <mach/sys_config.h> #include <mach/platform.h> #include <linux/slab.h> #define ACK 0 #define NACK 1 #define SA 0x5a //Slave address 单个MLX90614时地址为0x00,多个时地址默认为0x5a #define RAM_ACCESS 0x00 //RAM access command #define EEPROM_ACCESS 0x20 //EEPROM access command #define RAM_TOBJ1 0x07 //To1 address in the eeprom #define RAM_TOBJ2 0x08 #define RAM_TA 0x06 #define DEVICE_NAME "mlx90614" //struct gpio_config { // u32 gpio; /* gpio global index, must be unique */ // u32 mul_sel; /* multi sel val: 0 - input, 1 - output... */ // u32 pull; /* pull val: 0 - pull up/down disable, 1 - pull up... */ // u32 drv_level; /* driver level val: 0 - level 0, 1 - level 1... */ // u32 data; /* data val: 0 - low, 1 - high, only vaild when mul_sel is input/output */ //}; #define SCL_NAME "sensor_sck" #define SDA_NAME "sensor_sda" struct gpio_func_desc { unsigned short pin; char *name; }; struct gpio_func_desc SCLK ={0,SCL_NAME};//蓝色 struct gpio_func_desc SDIN ={0,SDA_NAME};//白色 struct gpio_config *sclk_gpio_p = NULL; struct gpio_config *sdin_gpio_p = NULL; void SMBus_StartBit(void); void SMBus_StopBit(void);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值