|
10月10号终于收到了智龙V2的开发板,进行学习,撑握了linux内核3.0.82龙芯1c的编译生成和使用PMON在开发板安装的过程。
为了学习在Linux上开发驱动,设计编写温度传感器ds18b20的驱动程序。ds18b20是一个单总线ONEWIRE,比较容易实现,适合学习。
驱动安装后,可以用cat命令看sysfs中的文件就能读出现在的温度。
/sys/devices/platform/ds18b20.0 # cat temperature
temperature=27.625
先定义了一个平台驱动,因此需要修改内核。将ds18b20.h放在内核/include/linux目录。
修改内核/arch/mips/loogson/ls1x/ls1c/platform.c加入
#include <linux/ds18b20.h>
static struct ds18b20_platform_data ds18b20_pdata = {
//GPIO54,开发板上红色LED
.pin = 54,
//设备主号
.devmajor = 150,
};
static struct platform_device ds18b20_device = {
.name = "ds18b20",
.id = 0,
.dev.platform_data = &ds18b20_pdata,
};
在static struct platform_device *ls1b_platform_devices[] __initdata 加入 &ds18b20_device
make生成vmlinux,使用tftp和pmon安装到开发板就完成了内核的开发。
驱动程序ds18b20.c编译成功会生成驱动程序ds18b20.ko文件。用tftp传到开发板使用insmod安装。
#insmod ds1b820.ko
这里应该有目录/sys/devices/platform/ds18b20.0,这个目录下应用文件temperature、rom和register。
/sys/devices/platform/ds18b20.0 # ls -l
total 0
lrwxrwxrwx 1 root 0 0 Jan 1 05:33 driver -> ../../../bus/platform/drivers/ds18b20
-r--r--r-- 1 root 0 4096 Jan 1 00:45 modalias
-rw-rw-rw- 1 root 0 4096 Jan 1 05:33 register
-r--r--r-- 1 root 0 4096 Jan 1 05:33 rom
lrwxrwxrwx 1 root 0 0 Jan 1 00:45 subsystem -> ../../../bus/platform
-r--r--r-- 1 root 0 4096 Jan 1 05:33 temperature
-rw-r--r-- 1 root 0 4096 Jan 1 00:45 uevent
驱动程序ds18b20.c,module_init函数为ds18b20_init,注册驱动ds18b20_driver。
ds18b20_driver的probe函数为ds18b20_probe,注册一个字符设备cdev,生成sysfs的文件。
申请gpio54端口,写入500us的低电平,然后释放数据线,等480us内检测到一个低脉冲就存在ds18d20设备。
register文件的读对应函数ds18b20_readreg,复位,发送命令0XCC跳过ROM设置,发送命令0XBE读取9个寄存器。
第0、1字节为温度的低8位和高8位。第8个寄存器为CRC校验。当crc校验成功后将第0、1字节转换为10进度的温度打印返回。
register文件的写对应函数ds18b20_writereg。参数为[9-12],表示转换精度。复位,命令0XCC跳过ROM,发命令0X4E写入
配置寄存器确定转换精度。
temperature文件的读对应函数ds18b20_get。将设备reset后发送0XCC命令跳过ROM设置,发送0X44命令进行
温度转换。转换速度由配置寄存器转换位数决定。12位精度时间较长需要500ms。 在数据线检测到低脉冲说明转换完成。
然后进行读取register文件一样的过程,读取寄存器、CRC校验、打印温度等。
rom文件的读取可以读出ds18b20中rom数据。
示例:
#cd /sys/devices/platform/ds18b20.0
/sys/devices/platform/ds18b20.0 #cat temperature
temperature=27.625
/sys/devices/platform/ds18b20.0 # cat rom
[23821.664000] ds18b20 init ok!
[23821.676000] rom[0]=0x28
[23821.688000] rom[1]=0xf0
[23821.700000] rom[2]=0xff
[23821.712000] rom[3]=0x79
[23821.728000] rom[4]=0x06
[23821.740000] rom[5]=0x00
[23821.752000] rom[6]=0x00
[23821.764000] rom[7]=0x4f
硬件的连接:ds18b20只有三条线,电源+,地-和数据线out。根据开发板引脚图:
1 - VD3.3 - ds18d20 +
3 - GGND - ds18d20 -
16 - GPIO54 - ds18d20 out
选GPIO54作为数据线因为GPIO54对应智龙V2开发板上红色LED,方便观察工作情况。
|
|