天嵌 ARM开发社区

 找回密码
 注册
查看: 3298|回复: 5

linux下驱动DS18B20笔记

[复制链接]
jammy 发表于 2009-4-5 16:32:13 | 显示全部楼层 |阅读模式
在加载到linux之前,我先确保DS18B20在无OS的环境下能正常工作,即“裸奔”。这个阶段也不是一路顺利,虽然以前有在单片机下驱动DS18B20的经验,但是在ARM延时确实是个问题。上网搜索一下,有的人用定时器延时,有的就直接程序耗时的方式延时。急于求成的我,为了避免使用定时器又出现新的麻烦,唯有使用后者的方法。好了,解决延时问题,DS18B20也自然运行起来,没有辜负我!哈~

       “裸奔”成功之后,现在就要给DS18B20披上linux的大衣。这次同样是将它以字符型设备驱动。按上次驱动LED的过程照葫芦画瓢,一个驱动程序,一个测试程序。



驱动程序

       驱动程序对比上次有所加深,多使用了几个系统调用函数。



       open()函数,对设备特殊文件进行open()系统调用时,将调用驱动程序的open () 函数:

    int (*open)(struct inode * ,struct file *);

       其中参数inode为设备特殊文件的inode (索引结点) 结构的指针,参数file是指向这一设备的文件结构的指针。open()的主要任务是确定硬件处在就绪状态、验证次设备号的合法性(次设备号可以用MINOR(inode-> i - rdev) 取得)、控制使用设备的进程数、根据执行情况返回状态码(0表示成功,负数表示存在错误) 等。



       read()函数。当对设备特殊文件进行read() 系统调用时,将调用驱动程序read() 函数:

     ssize_t (*read) (struct file *, char *, size_t, loff_t *);

       来从设备中读取数据。当该函数指针被赋为NULL 值时,将导致read 系统调用出错并返回-EINVAL("Invalid argument,非法参数")。函数返回非负值表示成功读取的字节数(返回值为"signed size"数据类型,通常就是目标平台上的固有整数类型)。



release()函数,当最后一个打开设备的用户进程执行close ()系统调用时,内核将调用驱动程序的release () 函数:

void (*release) (struct inode * ,struct file *) ;

release 函数的主要任务是清理未结束的输入/输出操作、释放资源、用户自定义排他标志的复位等。

在我的blog中有完整驱动代码,有兴趣的朋友可以参考下!
http://blog.163.com/jammy_lee/bl ... 0093153858522/edit/
pare 发表于 2009-4-11 23:22:06 | 显示全部楼层
我怎么驱动编译时中过不去啊 好像内核版本不对啊 谢谢
 楼主| jammy 发表于 2009-4-12 15:32:02 | 显示全部楼层
请问哪里出了问题呢? 如果需要的话加我QQ,我把程序文档发送给你。
zorry 发表于 2009-4-17 15:43:00 | 显示全部楼层
看看了..............................
huyutao 发表于 2011-2-23 19:42:08 | 显示全部楼层
你内核版本是多少的阿?
nan 发表于 2011-12-4 14:15:29 | 显示全部楼层
这样的代码不要随便找来忽悠人!!!
你还编译过去了?????!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-6-16 13:26 , Processed in 1.062500 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表