接下来就是Z-TURN
开发板上面的加速度,温度传感器的驱动方法:
在这里先配置,讨论一下温度传感器的驱动。
需要使用到的头文件
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
然后就是传感器和需要的宏
- #define DEV_NAME "myir-stlm75x"
- //
- /*********************
- * Register define *
- *********************/
- #define REG_TEMP 0x0
- #define REG_CON 0x1
- #define REG_TOS 0x2
- #define REG_THYS 0x3
- #define MAX_CONV_MS 150
- #define SIGN_MASK (0x1 << 15)
- #define TEMP_SHIFT 7
- #define TEMP_MASK (0xFF << TEMP_SHIFT)
- #define DEGREE_PER_CNT 0.5
依赖于本人的视力比较差,所以对使用的温度传感器只能看到NXP恩智浦的,其它看不到,哎,也与我手边没有放大镜的缘故,话说信息行业不带眼睛说明你的基因非常不错,像我这样1000度的大眼镜真的非常烦恼,尤其是游泳之类的活动---你懂得。
不过原理图上面写的是STLM75,所以你需要知道怎么样驱动LM75
先放上作者和描述
- MODULE_AUTHOR("Kevin Su ");
- MODULE_DESCRIPtiON("MYIR stlm75x temperature driver.");
然后就是驱动接口的定义:
- static struct i2c_driver myir_stlm75x_driver = {
- .driver = {
- .owner = THIS_MODULE,
- .name = DEV_NAME,
- },
- .id_table = myir_stlm75x_id,
- .probe = myir_stlm75x_probe,
- .remove = myir_stlm75x_remove,
- };
然后就是具体的驱动,有关的原理可以看我上一篇发的内容:
- static int myir_stlm75x_readwrite(struct i2c_client *client,
- u16 wr_len, u8 *wr_buf,
- u16 rd_len, u8 *rd_buf)
- {
- struct i2c_msg wrmsg[2];
- int i = 0;
- int ret;
- if (wr_len) {
- wrmsg[i].addr = client->addr;
- wrmsg[i].flags = 0;
- wrmsg[i].len = wr_len;
- wrmsg[i].buf = wr_buf;
- i++;
- }
- if (rd_len) {
- wrmsg[i].addr = client->addr;
- wrmsg[i].flags = I2C_M_RD;
- wrmsg[i].len = rd_len;
- wrmsg[i].buf = rd_buf;
- i++;
- }
- ret = i2c_transfer(client->adapter, wrmsg, i);
- if (ret < 0)
- return ret;
- if (ret != i)
- return -EIO;
- return 0;
- }
- static ssize_t myir_stlm75x_show(struct class *cls, struct class_attribute *attr, char *buf)
- {
- struct myir_stlm75x_data *pdata = (struct myir_stlm75x_data *)container_of(cls, struct myir_stlm75x_data, class);
- int ret;
- int value;
- unsigned long start_time;
-
- mutex_lock(&pdata->mutex);
-
- start_time = jiffies;
- pdata->temp_value = myir_stlm75x_read_word(pdata, REG_TEMP);
- // printk(KERN_ERR "pdata->temp_value: %#X", pdata->temp_value);
- value = to_readable_value(pdata->temp_value);
- ret = sprintf(buf, "%d.%sn", value/2, value%2?"5":"0");
- while (time_before(jiffies, start_time + msecs_to_jiffies(MAX_CONV_MS))) schedule();
-
- mutex_unlock(&pdata->mutex);
-
- return ret;
- }
由于篇幅限制,这里只发其中的一部分,其他在下一篇文章之中发布:敬请期待