想着有个ds18b20,于是就写了一个18b20的驱动。是在mini2440上面实现的。
ldd3的大师说得好,linux驱动应该尽可能多的提供机制,而不是提供策略。我觉得说得太有道理了。驱动本身就不应该涉及到太多策略问题,策略问题应该尽可能多的由应用程序去提供。作为驱动,应该尽可能多得去实现提供硬件的功能,然后留出接口给上面的应用程序调用。
其实ds18b20驱动比较简单,无非就是在单片机驱动18b20的基础上,家里一个字符驱动设备的外套。下面直接上代码吧。
驱动代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//自动创建设备需要此头文件 #define DQ S3C2410_GPF(3) //mini2440里面是这样定义GPIO的
#define DQ_IN S3C2410_GPIO_INPUT //设置DQ为输入
#define DQ_OUT S3C2410_GPIO_OUTPUT //设置DQ为输入
#define D_MAJOR 0 //定义主设备号
#define D_MINOR 0 //定义从设备号
#define DEV_NAME 'ds18b20' //定义设备名
static int ds18b20_major = D_MAJOR;//ds18b20主设备号
static int ds18b20_minor = D_MINOR;//ds18b20从设备号
static struct class *my_class; //定义class,用于自动挂载设备
static struct class_device *my_device; //自动挂载设备
static struct ds18b20_dev{ //放在一个结构体中
struct cdev cdev; //这个结构体比较简单,但是建议以后将用户的东西都放在一个结构体中
};
struct ds18b20_dev *ds18b20_devp;
void ds18b20_reset(void) //重启ds18b20
{
s3c2410_gpio_cfgpin(DQ, DQ_OUT); //设置为输出
s3c2410_gpio_pullup(DQ, 0); //设置下拉
s3c2410_gpio_setpin(DQ, 0); //拉低总线
udelay(500); //需要将总线拉低480~950us
s3c2410_gpio_setpin(DQ, 1); //释放总线
udelay(60); //DS18B20拉低信号,60~240us表示应答
s3c2410_gpio_cfgpin(DQ, DQ_IN); //读入DS18B20拉低信号
while(s3c2410_gpio_getpin(DQ)); //等待DS18B20应答
while(!s3c2410_gpio_getpin(DQ)); //等待DS18B20释放总线
}
void write_ds18b20(unsigned char Data) //写命令到ds18b20
{
unsigned char i;
s3c2410_gpio_cfgpin(DQ, DQ_OUT); //设置为输出
s3c2410_gpio_pullup(DQ, 1); //���拉
for(i=0;i<8;i++){
s3c2410_gpio_setpin(DQ, 0); //拉低总线
udelay(10); //需要拉低10~15us
if(Data&0x01)
s3c2410_gpio_setpin(DQ, 1);
else
s3c2410_gpio_setpin(DQ, 0);
udelay(40); //需要拉低20~40us来写0
s3c2410_gpio_setpin(DQ, 1); //释放总线
udelay(1); //稍微延时
Data >>= 1;
}
}
static unsigned char read_ds18b20(void) //读ds18b20
{
unsigned char Temp=0,i;
for(i=0;i<8;i++){
Temp >>= 1;
s3c2410_gpio_cfgpin(DQ, DQ_OUT); //DQ为输出状态
s3c2410_gpio_setpin(DQ, 0); //拉低总线,启动输入
udelay(1); //拉低总线约1us
s3c2410_gpio_setpin(DQ, 1); //释放总线
s3c2410_gpio_cfgpin(DQ, DQ_IN); //DQ为输入状态
if(s3c2410_gpio_getpin(DQ))
Temp |= 0x80;
udelay(45); //延时45us
}
return Temp;
}
static int ds18b20_open(struct inode *inode,struct file *filp)
{
filp->private_data = ds18b20_devp;
ds18b20_reset();
printk(KERN_NOTICE 'open ds18b20 successfuln');
return 0;
}
static ssize_t ds18b20_read(struct file *filp,char __user *buf,size_t size,loff_t *ppos)
{
unsigned long err;
struct ds18b20_dev *dev = filp->private_data;
unsigned char result[2] = {0x00, 0x00}; //这个是用来存放从ds18b20读到的值
ds18b20_reset(); //reset ds18b20
write_ds18b20(0xCC); //跳过ROM
write_ds18b20(0x44); //温度转换
ds18b20_reset(); //reset ds18b20
write_ds18b20(0xCC); //跳过ROM
上一篇:mini2440 编译U-Boot-1.1.6遇到的一些问题
下一篇:U-Boot-2011.03移植nandflash到mini2440
推荐阅读最新更新时间:2026-03-22 18:49
- LT3088IDD 宽安全工作区电源的典型应用
- 使用 Analog Devices 的 LT3663IDCB-3.3 的参考设计
- ADR425 可编程 DAC 参考的典型应用
- LT4276BIUFD 25.5W(类型 2)PoE+ 电源在反激模式下的典型应用电路,具有 24V、1A 输出
- 具有浪涌电流限制的低待机损耗功率前端
- LT4275AHMS IEEE 802.3at(类型 2)25.5W 受电设备的典型应用电路
- 采用 MSP430 电容式触控 MCU、触觉元件和 LCD 的 MSP432 MCU 参考设计
- 具有 6uA 反向泄漏电流的 LT1767EMS8E-3.3 双源电源的典型应用电路
- DER-282 - 使用HiperLCSTM LCS700HG设计的100 W超薄 (11 mm) LLC DC-DC转换器
- UART转USB桥接器



mini2440用户手册
mini2440Qt4.7移植文件系统
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号