基于WinCE S3C6410_IIC总线驱动开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计思路与操作过程
使用编译好的内核模块
加载驱动模块:Insmod 创建设备文件:mknod 运行应用测试程序:./test
驱动程序与应用程序
#include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/mm.h> #include <linux/sched.h> #include <linux/init.h> #include <linux/cdev.h> #include <asm/io.h> #include <asm/system.h> #include <asm/uaccess.h> #include <linux/device.h> /* device_create()*/ #include <asm/io.h> #include <asm/irq.h> #include <asm/uaccess.h> #include <mach/map.h> #include <plat/regs-adc.h> #include <mach/map.h> #include <linux/slab.h>
基本原理
S3C6410的IIC接口 S3C6410的IIC总线接口有四种操作模式:主控制器发送模式、主控制器接收模式、从属
器发送模式和从属器接收模式。 S3C6410处理器有4个寄存器来控制IIC总线的操作:IIC总线控制寄存器(IICCON)、IIC总
线控制/状态寄存器(IICSTAT)、IIC总线发送/接收数据移位寄存器(IICDS)和IIC总线地址寄存 器(IICADD)。
[9:0]
描述
等待中断模式下,触摸笔 向上或向下状态
X和Y坐标的自动定序转 换
X和Y坐标的手动测量
保留
X坐标的数据转换(包括 正常的ADC的转换数据值)
初始状态 -
-
while(ADCCON & 0x01);//check if Enable_start is low while(!(ADCCON &0x8000)); ret = ADCDAT0 & 0x3ff;
} /*文件释放函数*/ static int adc_release(struct inode *inode, struct file *filp)
ret = ADCDAT0 & 0x3ff;
{
count = copy_to_user(buf,(char *)&ret,sizeof(ret));
printk("$$$$$$%s$$$$$\n", __func__);
return sizeof(ret); }
return 0; }
驱动程序与应用程序
驱动程序
/*设备驱动模块加载函数*/
int adc_dev_init(void)
百度文库
{
int result; printk("$$$$$$%s$$$$$$\n", __func__);
dev_t devno = MKDEV(adc_major, 0); /* 申请设备号*/ if (adc_major)
printk(KERN_NOTICE "Error %d adding LED%d", err, index); } struct class *myclass;
驱动程序与应用程序
驱动程序
/*读函数*/ static ssize_t adc_read(struct file *filp, char __user *buf, size_t size,
struct adc_dev *adc_devp; /*设备结构体指针*/
/*初始化控制寄存器*/ static int adc_init(void) {
unsigned int preScaler = 0XFF;
ADCCON = (1<<14) | (preScaler<<6) | (0<<3) | (0<<2);
基本原理
ADCCON ECFLG PRSCEN PRSCVL
SEL_MUX STDBM
READ_START ENABLE_START
位 [15] [14] [13:6] [5:3] [2] [1] [0]
描述 转换的结束标志 ADC预定标器启动 ADC预定标器值0xFF 模拟输入通道选择
待机模式选择 A/D转换开始读取 A/D转换开始启用
ADCCON |= ADC_START;
return 0; }
/*文件操作结构体*/ static const struct file_operations adc_fops = {
.owner = THIS_MODULE, .read = adc_read, .open = adc_open, .release = adc_release, };
result = register_chrdev_region(devno, 1, "adc"); else { /* 动态申请设备号 *
result = alloc_chrdev_region(&devno, 0, 1, "adc"); adc_major = MAJOR(devno); }
/*自动创建设备文件*/ myclass = class_create(THIS_MODULE,"test_char"); device_create(myclass, NULL, MKDEV(adc_major,0), NULL, "adc"); base_addr = ioremap(0x7E00B000,0X20); if(base_addr == NULL) { printk("failed to remap\n"); return -ENOMEM; }
loff_t *ppos) {
unsigned int count = size;
int ret = 0;
printk("$$$$$%s$$$$$\n", __func__);
ADCCON |= ADC_START;
while(ADCCON & 0x01);//check if Enable_start is low
设计思路与操作过程
设计思路
编写驱动程序并编 译成内核文件
制作测试应用程 序
使用编译好的内 核模块
编写驱动程序: vim adc_driver.c
Makefile生成adc_driver.ko:make
编写测试程序:vim adc_test.c
生成可执行程序adc_test: arm-linux-gcc adc_test.c –o adc_test
CPU发出的控制信号分为地址码和控制量两部分: 1) 地址码用来选址,即接通需要控制的电路,确定控制的种类; 2) 控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。 这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
基本原理
IIC总线工作原理: b -- 信号类型
IIC总线在传送数据过程中共有四种类型信号: 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据; 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据; 数据传输信号:在开始条件以后,时钟信号SCL的高电平周期期问,当数据线稳定时,数据线 SDA的状态表示数据有效,即数据可以被读走,开始进行读操作。在时钟信号SCL的低电平周期期 间,数据线上数据才允许改变。每位数据需要一个时钟脉冲。 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示 已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应 答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出 现故障。
static int adc_major = ADC_MAJOR; //ADC主设备号240
驱动程序与应用程序
驱动程序
/*设备结构体注册*/ struct adc_dev {
struct cdev cdev; //cdev结构体
unsigned char mem[ADC_SIZE]; //全局内存 };
if (result < 0) return result;
/* 动态申请设备结构体的内存*/ adc_devp = kmalloc(sizeof(struct adc_dev), GFP_KERNEL);
return 0; fail_malloc: unregister_chrdev_region(devno, 1);
器及其外围设备。方便了管理。
基本原理
IIC总线工作原理 a -- 总线构成
IIC总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之 间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就 像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输 过程中,IIC总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取 决于它所要完成的功能。
Tiny6410 中 AIN0 连接到了开发板上 的可调电阻 W1
03 ADC寄存器
ADCDLY、ADCTSC、 ADCCON、ADCDAT0
基本原理
一、IIC 基础概念 1.1 IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制
/*初始化并注册cdev*/ static void adc_setup_cdev(struct adc_dev *dev, int index) {
int err, devno = MKDEV(adc_major, index); cdev_init(&dev->cdev, &adc_fops); dev->cdev.owner = THIS_MODULE; err = cdev_add(&dev->cdev, devno, 1); if (err)
驱动程序
static void __iomem *base_addr;//定义了用来保存经过虚拟映射后的内存地址
/*定义ADC寄存器地址*/ #define __ADCREG(name) (*(volatile unsigned long *)(base_addr + name))
#define ADCCON
基于WinCE S3C6410_IIC总线驱动开发
谭佳、张钰佳 2019.12.17
CONTENTS
基于WinCE S3C6410_IIC总线驱动开发 基本原理 设计思路及操作过程 驱动程序与应用程序 实验结果与总结
基本原理
01 ADC模块管脚
8个通道 10-bits
关于AD转换
02 开发板上ADC输入
while(!(ADCCON &0x8000));
/*文件打开函数*/ static int adc_open(struct inode *inode, struct file *filp)
{
printk("$$$$$%s$$$$$\n", __func__);
adc_init();
return 0;
加载驱动模块Insmod adc_driver.ko 设置设备节点:mknod /dev/adc_drvier c 240
运行应用测试程序./adc_test
设计思路与操作过程
编写驱动程序并编译成内核文件
Makefile生成adc_driver.ko
设计思路与操作过程
制作测试应用程序
生成可执行程序 adc_test:
初始状态 0 0
0xFF 0 1 0 0
ADCCON = (1<<14) | (preScaler<<6) | (0<<3) | (0<<2);
基本原理
ADCDAT0
UPDOWN
AUTO_PST
XY_PST Reserved XPDATA(Normal
ADC)
位 [15]
[14] [13:12] [11:10]
__ADCREG(S3C_ADCCON)
#define ADCDAT0 __ADCREG(S3C_ADCDAT0)
#define ADC_START
(1 << 0)
#define ADC_SIZE 0x1000 //全局内存最大4K字节
#define ADC_MAJOR 240 //预设的adc主设备号
相关文档
最新文档