嵌入式学习71-复习(内核定时器和传感器)

缺少内核配置文件.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 将要拷贝的数据的字节数。
 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值