当前位置:文档之家› 基于S3C2410A_D转换Linux驱动程序设计_饶少锋

基于S3C2410A_D转换Linux驱动程序设计_饶少锋


换结束。
PRSCEN: A/D 转换器预分频器使能;0:频器数值;数据值范围:1~255 。
SEL_MUX:
模拟输入通道选择;从 000~111 依次为
通道 AIN0~AIN1。
STDBM: Standby 静 态 模 式 选 择 ;0: 普 通 模 式 ,1:
备等;网络设备是通过套接字来访问的特殊设备。无论是什么
类型的设备,Linux 系统都是通过在内核中维护特殊的设备控制
块来与设备驱动程序接口的。在字符设备和块设备的控制块中,
有一个重要的数据结构 file_operations, 该结构中提供给应用程
序访问硬件设备的各种方法。
该结构实际就是声明了针对各种设备不同操作的函数指
星的 S3C2410X 嵌入式 ARM 微处理器,介绍了在 Linux 操作系统下,对 S3C2410X 微处理器内部 A/D 转换器的驱动方法;通过编写该 A/
D 转换驱动程序,总结出一种在嵌入式 Linux 操作系统下快速方便的开发驱动程序的方法。
关键词: 嵌入式系统; Linux 操作系统; 设备驱动; A/D 转换
Standby 模式。
READ_ START:通过读取来启 动 A/D 转换;0:停止通过读
取启动,1:使能通过读取启动。
ENABLE_START:通过设置该位来启动 A/D 操作;0:无操
作,1:启动转换。
ADCDAT0 为 A/D 转换数据寄存器,16 位寄存器,其中[9: 0] 位 为 转 换 结 果 ,在 此 驱 动 程 序 中 ,只 要 在 转 换 结 束 后 ,读 取 ADCDAT0 的低 10 位就可以得到转换结果。
来完成设备驱动程序的注册和卸载 (其中 mydev_init 和 my-
dev_cleanup 函数即为用 __init 和 __exit 声明的初始化函数和清
除函数)。本驱动程序程序是使用后一种方法。
在本驱动程序中初始化函数为 adc_init 主要完成一些初始
化的工作,它完成硬件设备的初始化和向操作系统内核注册该
通过查阅 S3C2410X 芯片资料,A/D 转换驱动程序中主要用 的寄存器有两个 ADCCON 和 ADCDAT0。其基本的描述如下表:
饶少锋: 硕士研究生
ADCCON 是 A/D 转换的控制寄存器,它是一个 16 位的寄存器, 寄存器的功能位定义如下:
ECFLG: A/D 转换结束标志;0:表示转换中,1:表示转
{
int ret;
ret =register_chrdev (DEVICE_MAJOR,DEV_NAME,
&adc_fops);
if (ret<0)
{ printk(DEV_NAME "cannot get major number! \n"); return ret; } printk("adc device register success! \n"); ADCCON=(1<<14)|(19<<6)|(4<<3)|(0<<2); return 0; } 其中 ADCCON=(1<<14)|(19<<6)|(4<<3)|(0<<2); 就是对 ADC 控制器的硬件初始化,1<<14 是转换预分频器 PRSCEN 使能; 19<<6 指设置预分频值 PRSCVL, 本驱动程序预分频值设置为 19, 若 PCLK 频率是 50MHz 且 ADCCON 寄存器中预分频器的 设置值是 19 时,转换得到 10 位数字量时间: A/D 转换器频率= 50 MHz/(19+1) = 2.5 MHz , 转换时间= 1/(2.5MHz / 5 周期) = 2 us ; 4<<3 指 A/D 转换通道的选择通道 AIN4,即 SEL_MUX 为[1 0 0];0<<2 A/D 转换模式的选择,0 即选择普通模式。 adc_read 函数为应用程序系统调用 read 时调用的函数,也 是 A/D 转换驱动程序的关键方法,在应用程序使用 read 系统调 用时,adc_read 函数被调用,它会通过设置 ADCCON 的第 0 位 ENABLE_START 为 1 来启动 A/D 转换,该位会 A/D 转换开始 后又硬件自动清零。然后程序等待 A/D 转换结束,通过查询 A/D 转换结束标志 ECFLG,即 ADCCON 的第 15 位,若该位为 1 表 示结束,为 0 表示正在转换中。A/D 转换结束后,即可读取 ADC 数据寄存器 ADCDAT0 的低 10 位到 ADC 设备的缓冲区中,应 用程序就是通过该缓冲区接口得到 A/D 转换数据的,该函数的 代码如下: static ssize_t adc_read (struct file *filp,char *buffer,size_t count,loff_t* ppos) { int adc_data=0; ADCCON|=0x1; while(ADCCON&0x1); while(! (ADCCON&0x8000)); adc_data=ADCDAT0&0x3ff; udelay(100); copy_to_user(buffer,(char *)&adc_data,sizeof(int)); return sizeof(char); }
中图分类号: TP368.1
文献标识码: A
Abstract: Embedded operating system such as the applications of ARM -Linux have become more and more popular. Because all kinds of embedded devices are different each other, we should design and develop its own device driver in the developing of the different embedded products.This makes embedded Linux device driver development occupy a heavy proportion in the whole cycle of embedded systems development. In this paper, the interface method of internal A/D converter was presented based on the Samsung S3C2410X embedded ARM microprocessor. In the preparation of A/D converter driver programming, the hardware-driven approach in Linux operating system was introduced, and a rapid and convenient development driver approach in embedded Linux operating system was also summed up in this paper. Key words: embedded systems; Linux operating system; device driver; A/D convert
3 驱动程序的设计
linux 驱动程序为应用程序屏蔽了硬件的细节, 它为应用程
《P LC 技术应用 200 例》
邮局订阅号:82-946 360 元 / 年 - 177 -
ARM开 发 与 应 用
中文核心期刊《微计算机信息》(嵌入式与 S OC )2008 年第 24 卷第 11-2 期
序提供了一组典型的操作接口。通过这个接口,用户可以像处
您的论文得到两院院士关注 文 章 编 号 :1008-0570(2008)11-2-0177-03
ARM开 发 与 应 用
基于 S3C2410 A/D 转换 Linux 驱动程序设计
The Linux Driver Programming Based on S3C2410 A/D Converter
转换的硬件驱动,它在 file_operations 结构中的初始化代码如
下:

static struct file_operations adc_fops={
owner: THIS_MODULE,

open: adc_open,
release:adc_release,

read: adc_read,
技 术 创 新
1 引言
随着电子和计算机技术的不断发展,嵌入式系统已经被广 泛的应用于很多领域中,从智能玩具到航空航天,嵌入式系统的 应用在某程度上可以说是无处不在,但是随着信息化的发展,又 给嵌入式系统的开发和应用带来了新的挑战。在嵌入式 Linux 系统的开发中,嵌入式设备种类繁多的特点决定了不同的嵌入 式产品在开发时都必须设计和开发自己的设备驱动程序,使得 嵌入式 Linux 设备驱动程序的开发在整个嵌入式系统开发工作 中占有举足轻重的地位。而基于 ARM 架构的中高档的嵌入式 系统应用已经非常广泛,本文针对现在非常流行的一款三星公 司生产的 ARM9 嵌入式微处理器—S3C2410X,在 Linux 操作系 统下实现了对 AD 转换的驱动,通过该驱动程序实例,介绍在 Linux 系统下驱动程序编写的一般方法,包括驱动程序和测试程 序的编写。
设备驱动程序的主设备号和设备名称,每一个设备驱动程序都
有唯一的一个主设备号,对于同一个驱动程序可以驱动同一类
型不同的设备,而这些设备之间是通过驱动程序的次设备号来
区分的。对于字符设备驱动程序,是通过 register_chrdev 函数来
相关主题