电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1461|回复: 0
收起左侧

嵌入式学到了什么_英创信息技术EM9280 Linux下AD驱动的应用介绍

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-7-22 10:53:06 | 显示全部楼层 |阅读模式
嵌入式学到了什么_英创信息技术EM9280 Linux下AD驱动的应用介绍,   

1、Linux驱动程序调用方法概述

        在Linux环境中,通过驱动程序来操作相应硬件接口,对于应用程序来说就是打开特定文件名称的文件,然后通过常规的对文件读写或控制的方法,来实现对硬件接口的访问。在嵌入式系统中,对硬件的读写通常采用ioctl函数的形式,其典型的流程如下:
流程 实现功能 实现函数 备注
第一步 打开文件   fd = open(devname, …);   特定设备文件名称
第二步 访问接口
   rc = ioctl(fd, cmd, …);
   rc = read(fd, buf, size);
   rc = write(fd, buf, size);
   可能调用多次,多种cmd
第三步 关闭文件   close(fd);   不再操作,则关闭


        其中ioctl(…)的基本定义为:

         int ioctl(int fd, int cmd, unsigned long arg);
         输入参数 fd: 为打开文件获得的文件描述符
                          cmd: 操作命令码,在EM9280_drivers.h头文件中以定义
                          arg: 需要传递的参数指针,不同的命令必须严格匹配相应的参数类型
         返回值 = 0: 调用成功
                     = EBADF: 非法文件描述符
                     = EFAULT: arg指向不可访问的内存空间
                     = EINVAL: 非法的cmd或arg参数
                     = ENOTTY: 文件描述符未指向特殊的字符设备

2、EM9280 AD驱动的应用

        EM9280共有2路低速的模拟AD通道AIN1和AIN2,输入量程为0 – 3.6V,AD分辨率12-bit。所谓低速通道,表示这两个通道只能用于外部的直流或慢变化类型的信号。除此之外,EM9280还可提供对输入的+5V电源电压、+3.3V电源电压以及核心CPU基片温度的监测。

         EM9280 AD驱动是以模块(module)形式提供给客户,相应的驱动文件放在根文件系统中:/lib/modules/2.6.35.3/em9280_ad.ko,EM9280 AD驱动所对应的设备文件名称为“/dev/em9280_ad”。

         首先需要加载em9280_ad驱动:
         #>insmod /lib/ modules/2.6.35.3/em9280_ad.ko

         然后应用程序可打开AD驱动程序对应的设备文件“/dev/em9280_ad”,可多次调用read( )来读取各类数据。read( )函数需要带上如下结构数据:

         struct daq_info
         {
                 unsigned int cmd; // 命令码 = 0, 1, 2, ....
                 unsigned int data; // 返回的AD数据
                 char unit[16]; // 返回的单位字串: \“mV\“, \“Kalvin\“等
         } ;

         其中cmd参数用于定义AD通道:
         0 ---- AD采集通道1
         1 ---- AD采集通道2
         2 ---- +5V电源电压
         3 ---- +3.3V电源电压
         6 ---- 核心CPU基片温度

         注意返回的温度参数均为开氏温度,转换成摄氏温度,大致减去273即可。在此基础上,应用程序的典型代码如下:

         int main(int argc, char** argv)
         {
                 int fd;
                 int i1, rc;
                 int nChIndex;
                 struct daq_info ad;
                 printf(\“Driver em9280_ad test v1.0\n\“);
                 nChIndex = 1;
                 if(argc > 1)
                 {
                         nChIndex = atoi( argv[1] );
                 }
                 fd = open(\“/dev/em9280_ad\“, O_RDWR);
                 printf(\“open file = %d\n\“, fd);
                 if( fd<0 )
                 {
                         return -1;
                 }
                 ad.cmd = nChIndex;
                 for( i1=0; i1<20; i1++)
                 {
                         rc = read(fd, (void*)&ad, sizeof(ad) );
                         printf( \“nValue = %d (%s)\n\“, ad.data, ad.unit );
                         sleep(1);
                 }
                 close(fd);
                 printf(\“close file\n\“);
                 return 0;
         }
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表