缺少内核配置文件.config
解决:cp config_mini2440_td35 .config
1.make 编译一下 生成timer.ko文件
2. cp timer.ko ~/nfs/rootfs
为什么要拷贝到rootfs中,这是挂载的根文件系统 ,使用nfs作为根文件系统
实际上内核启动的时候并不知道根文件系统在什么地方,我们是通过uboot给kernel传参来告知kernel根文件系统在什么位置。通过设置uboot环境变量bootargs来设置传参。
---------------------------------------------------------------------------------------------------------------------------------
内核定时器
#include <linux/init.h>
91 #include <linux/timer.h>
92 #include <linux/module.h>
93
94 static struct timer_list timer;
{> 95
(> 96 static void time_out(unsigned long n) //产生中断后 进入到此函数
97 { //n 到时间的jiffies
98 printk("%lu\n",n);
0> 99 timer.data = jiffies; // 不能注释 否则回调函数数值不变
100 // timer.expires = jiffies + 3 * HZ;
1>101 mod_timer(&timer,jiffies + 3 * HZ); //循环打印时间 系统提供的函数 是注释处的功能实现
}>102 //1HZ =200 打印数值差为600
103 }
104
105 static int __init timer_init(void)
106 {
107 init_timer(&timer);
^>108 timer.function = time_out; //回调函数,定时期满需要执行的代码
109 timer.expires = jiffies + 3 * HZ; //expires 到 当前时间+3秒 产生中断
110 timer.data = jiffies; //data 从此时间起
111 add_timer(&timer);
112 return 0;
113 }
114
115 static void __exit timer_exit(void)
116 {
117 del_timer(&timer);
118 }
119
120
121 module_init(timer_init);
122 module_exit(timer_exit);
123
124 MODULE_LICENSE("GPL");
---------------------------------------------------------------------------------------------------------------------------------
ds18b20温度传感器
接线时,电源接2 VDD33V DQ接 12 EINT3
ds18b20时序图
DS18B20 是单线通信,即接收和发送都是这个通信脚进行的。
其接收数据时为高电阻输入,其发送数据时是开漏输出,本身不具有输出高电平的能力。 1.输出0时通过MOS下拉为低电平 2.输出1时,则为高阻,需要外接上拉电阻将其拉为高电平。 因此,需要外接上拉电阻,否则无法输出1。
DS18B20写入的功能命令:
ROM指令:
采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20
如果是单个DS18B20,直接写跳过ROM指令0xCC即可
RAM指令,DS18B20的一些功能指令
常用的是:
温度转换 0x44
开启温度读取转换,读取好的温度会存储在高速暂存器的第0个和第一个字节中
读取温度 0xBE
读取高速暂存器存储的数据
驱动流程:
1.在make 生成.ko文件后,cp 到 ~/nfs/rootfs/ 根文件目录下
2. 打开main.c 创建 fd open打开/dev/ds18b20_dev ,O_RDWR 内核层采集到的数据不方便处理的,放到应用层 main.c 中进行数据处理
3. 编译应用层代码,采用交叉编译器 arm-linux-gcc -o app main.c
4.在驱动文件中 ,由于是自动申请的设备号,所以先 cat /proc/devices 查看设备号
再 mknod /dev/ds18b201_dev c 253 0
5. 此时 ls /dev 下 出现了 ds18b20的设备文件
6.insmod ds18b20.ko 运行代码
7.在应用层中,将数据处理成浮点类型
--------------------------------------------------------------------------------------------------------------------------------
copy_to_user
copy_to_user和copy_from_user是在进行驱动相关程序设计的时候,要经常遇到的函数。由于内核空间与用户空间的内存不能直接互访,因此借助函数copy_to_user()完成内核空间到用户空间的复制,函数copy_from_user()完成用户空间到内核空间的复制
unsigned long copy_to_user (void __user * to, const void * from, unsigned long n);
从注释中就可以看出,这个函数的主要作用就是从内核空间拷贝一块儿数据到用户空间,由于这个函数有可能睡眠,所以只能用于用户空间。
To 目标地址,这个地址是用户空间的地址;
From 源地址,这个地址是内核空间的地址;
N 将要拷贝的数据的字节数
copy_from_user unsigned long copy_from_user (void * to, const void __user * from, unsigned long n);
从注释中就可以看出,这个函数的主要作用就是从用户空间拷贝一块儿数据到内核空间,由于这个函数有可能睡眠,所以只能用于内核空间
To 目标地址,这个地址是内核空间的地址;
From 源地址,这个地址是用户空间的地址;
N 将要拷贝的数据的字节数。