|
嵌入式学到了什么_英创信息技术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;
} |
|