【Z-turn Board试用体验】+ Zynq linux的I2C驱动学习笔记(三) - 问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【Z-turn Board试用体验】+ Zynq linux的I2C驱动学习笔记(三)

中科院 ( 楼主 ) 2015-6-23 19:24:38  只看该作者 倒序浏览
接下来就是Z-TURN开发板上面的加速度,温度传感器的驱动方法:
在这里先配置,讨论一下温度传感器的驱动。
需要使用到的头文件
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
复制代码

然后就是传感器和需要的宏
  1. #define DEV_NAME                "myir-stlm75x"
  2. //
  3. /*********************
  4. *        Register define  *
  5. *********************/
  6. #define REG_TEMP        0x0
  7. #define REG_CON                0x1
  8. #define REG_TOS                0x2
  9. #define REG_THYS        0x3

  10. #define MAX_CONV_MS        150
  11. #define SIGN_MASK        (0x1 << 15)
  12. #define TEMP_SHIFT        7
  13. #define TEMP_MASK        (0xFF << TEMP_SHIFT)
  14. #define DEGREE_PER_CNT        0.5
复制代码
依赖于本人的视力比较差,所以对使用的温度传感器只能看到NXP恩智浦的,其它看不到,哎,也与我手边没有放大镜的缘故,话说信息行业不带眼睛说明你的基因非常不错,像我这样1000度的大眼镜真的非常烦恼,尤其是游泳之类的活动---你懂得。
不过原理图上面写的是STLM75,所以你需要知道怎么样驱动LM75
先放上作者和描述
  1. MODULE_AUTHOR("Kevin Su ");
  2. MODULE_DESCRIPtiON("MYIR stlm75x temperature driver.");
复制代码
然后就是驱动接口的定义:
  1. static struct i2c_driver myir_stlm75x_driver = {
  2.     .driver = {
  3.         .owner        = THIS_MODULE,
  4.         .name        = DEV_NAME,
  5.     },
  6.     .id_table        = myir_stlm75x_id,
  7.     .probe                = myir_stlm75x_probe,
  8.     .remove                = myir_stlm75x_remove,
  9. };
复制代码
然后就是具体的驱动,有关的原理可以看我上一篇发的内容:
  1. static int myir_stlm75x_readwrite(struct i2c_client *client,
  2.                    u16 wr_len, u8 *wr_buf,
  3.                    u16 rd_len, u8 *rd_buf)
  4. {
  5.     struct i2c_msg wrmsg[2];
  6.     int i = 0;
  7.     int ret;

  8.     if (wr_len) {
  9.         wrmsg[i].addr  = client->addr;
  10.         wrmsg[i].flags = 0;
  11.         wrmsg[i].len = wr_len;
  12.         wrmsg[i].buf = wr_buf;
  13.         i++;
  14.     }
  15.     if (rd_len) {
  16.         wrmsg[i].addr  = client->addr;
  17.         wrmsg[i].flags = I2C_M_RD;
  18.         wrmsg[i].len = rd_len;
  19.         wrmsg[i].buf = rd_buf;
  20.         i++;
  21.     }

  22.     ret = i2c_transfer(client->adapter, wrmsg, i);
  23.     if (ret < 0)
  24.         return ret;
  25.     if (ret != i)
  26.         return -EIO;

  27.     return 0;
  28. }
复制代码
  1. static ssize_t myir_stlm75x_show(struct class *cls, struct class_attribute *attr, char *buf)
  2. {
  3.         struct myir_stlm75x_data *pdata = (struct myir_stlm75x_data *)container_of(cls, struct myir_stlm75x_data, class);
  4.         int ret;
  5.         int value;
  6.         unsigned long start_time;
  7.        
  8.         mutex_lock(&pdata->mutex);
  9.        
  10.         start_time = jiffies;
  11.         pdata->temp_value = myir_stlm75x_read_word(pdata, REG_TEMP);
  12. //        printk(KERN_ERR "pdata->temp_value: %#X", pdata->temp_value);
  13.         value = to_readable_value(pdata->temp_value);
  14.         ret = sprintf(buf, "%d.%sn", value/2, value%2?"5":"0");

  15.         while (time_before(jiffies, start_time + msecs_to_jiffies(MAX_CONV_MS))) schedule();
  16.        
  17.         mutex_unlock(&pdata->mutex);
  18.        
  19.         return ret;
  20. }
复制代码


由于篇幅限制,这里只发其中的一部分,其他在下一篇文章之中发布:敬请期待



2个回复

绝代双骄 发表于 2015-6-24 11:14:00
楼主赞
回复

举报 使用道具

中科院 发表于 2015-6-24 20:04:13

谢谢夸奖啊!一起努力学习z-turn吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /6 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-9-1 14:50 , Processed in 0.598638 second(s), Total 67, Slave 49 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表