[国嵌攻略][063][电阻屏驱动程序设计]

/********************************************************************
*名称:touchscreen.c
*作者:D
*时间:2015.11.23
*功能:
*	触摸屏驱动,由于MINI2440采用一线触控,而非四线电阻触控所以触摸屏
*	驱动无法使用。
********************************************************************/

/********************************************************************
*宏定义
********************************************************************/
#define INTMSK ( (*(volatile unsigned long *)0X4A000008) )      //中断掩码寄存器
#define INTSUBMSK ( (*(volatile unsigned long *)0X4A00001C) )   //子中断掩码寄存器

#define ADCCON ( (*(volatile unsigned long *)0x58000000) )   //ADC控制寄存器
#define ADCTSC ( (*(volatile unsigned long *)0x58000004) )   //ADC触摸屏控制寄存器

#define ADCDAT0 ( (*(volatile unsigned long *)0x5800000C) )   //ADC0转换数据寄存器
#define ADCDAT1 ( (*(volatile unsigned long *)0x58000010) )   //ADC1转换数据寄存器

#define SUBSRCPND ( (*(volatile unsigned long *)0X4A000018) )   //子中断掩码寄存器
#define SRCPND ( (*(volatile unsigned long *)0X4A000000) )      //中断源请求寄存器
#define INTPND ( (*(volatile unsigned long *)0X4A000010) )      //中断请求寄存器

/********************************************************************
*名称:init_touchscreen
*参数:
*	none
*返回:
*	none
*功能:初始化触摸屏
*********************************************************************/
void init_touchscreen(){
	//设置ADC转换频率
	ADCCON = (1<<14)|(49<<6);   //PRSCEN[14]:1, PRSCVL[13:6]:49 ADC_Freqeuncy=PCLK/(PRSCVL+1) PCLK=50MHz ADC_Freqeuncy=1MHz

	//等待按下中断
	ADCTSC = (0<<8)|(1<<7)|(1<<6)|(1<<4)|(0x3<<0);   //UD_SEN[8]:0, YM_SEN[7]:1, YP_SEN[6]:1, XM_SEN[5]:0, XP_SEN[4]:1, PULL_UP[3]:0, AUTO_PST[2]:0, XY_PST[1:0]:0b11

	//设置子中断掩码
	INTSUBMSK &= ~(1<<9);   //INT_TC[9]:0

	//设置中断掩码
	INTMSK &= ~(1<<31);   //INT_ADC[31]:0
}

/********************************************************************
*名称:touchscreen_irq
*参数:
*	none
*返回:
*	none
*功能:触摸屏中断服务
*********************************************************************/
void touchscreen_irq(){
	int x, y;

	if( !(ADCTSC&(1<<8)) ){   //如果是触摸屏按下,UD_SEN[8]:0
		//设置触摸屏自动转换
		ADCTSC = (1<<2);   //AUTO_PST[2]:1

		//启动ADC转换
		ADCCON |= (1<<0);   //ENABLE_START[0]:1

		//等待ADC转换结束
		while( !(ADCCON&(1<<15)) );   //ECFLG[15]

		//获取坐标
		x = ADCDAT0&(0x3FF<<0);   //XPDATA[9:0]
		y = ADCDAT1&(0x3FF<<0);   //YPDATA[9:0]

		//清除子中断请求
		SUBSRCPND |= (1<<9);   //INT_TC[9]:0

		//清除中断源请求
		SRCPND |= (1<<31);   //INT_ADC[31]:0

		//清除中断请求
		INTPND |= (1<<31);   //INT_ADC[31]:0

		//等待弹起中断
		ADCTSC = (1<<8)|(1<<7)|(1<<6)|(1<<4)|(0x3<<0);   //UD_SEN[8]:1, XY_PST[1:0]:0b11
	}else{                    //如果是触摸屏弹起,UD_SEN[8]:1
		//清除子中断请求
		SUBSRCPND |= (1<<9);   //INT_TC[9]:0

		//清除中断源请求
		SRCPND |= (1<<31);   //INT_ADC[31]:0

		//清除中断请求
		INTPND |= (1<<31);   //INT_ADC[31]:0

		//等待按下中断
		ADCTSC = (0<<8)|(1<<7)|(1<<6)|(1<<4)|(0x3<<0);   //UD_SEN[8]:0, XY_PST[1:0]:0b11
	}
}
时间: 2024-10-07 02:04:49

[国嵌攻略][063][电阻屏驱动程序设计]的相关文章

[国嵌攻略][117][LED驱动程序设计]

LED程序设计 1.编写内核模块 2.搭建字符驱动框架 3.实现设备方法 头文件 <linux/io.h> writel() leddev.h //设备命令 #define LED_MAGIC 'L' //LED幻数 #define LED_ON _IO(LED_MAGIC, 0) //打开LED #define LED_OFF _IO(LED_MAGIC, 1) //关闭LED leddev.c /***********************************************

[国嵌攻略][164][USB驱动程序设计]

USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.USB client driver:为USB外部设备提供驱动程序 USB设备模型 device(设备)->config(配置)->interface(接口)->endpoint(端点),构成了USB设备的四个层次.一个usb driver(驱动)对应的是一个interface(接口).一个接口

[国嵌攻略][151][nandflash驱动程序设计]

初始化 打开/drivers/mtd/nand/s3c2410.c找到nand flash驱动程序代码,找到模块初始化函数s3c_nand_init,找到platform_driver中的probe函数. 1.使能时钟 2.进行物理地址到虚拟地址转换 3.硬件纠错初始化 4.搜索nand flash 5.注册分区信息 nand flash读操作 nand flash读写函数位于通用驱动/drivers/mtd/nand/nand_base.c.nand flash的读函数位于nand_read的

[国嵌攻略][061][2440LCD驱动设计]

LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch):表示在一帧图像结束后,垂直同步信号以前的无效的行数 VSPW(vertical sync pulse width):表示垂直同步脉冲的宽度,用行数计算 HBPD(horizontal back porch):表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数 HFPD(horizon

[国嵌攻略][131][串口驱动分析-接收]

tty数据接收流程 //tty子系统 1.tty_fops中的tty_read响应系统调用 2.tty_read调用tty_ldisc_N_TTY中的n_tty_read n_tty_read 1.设置app的状态 2.如果没有数据可读,让阻塞生效 3.如果有数据可读,从read_buf中读走数据 什么时候串口驱动会把数据送到n_tty_read的read_buf中 当串口接收到数据时会产生接收中断,然后中断处理程序会把数据送到read_buf中. 串口驱动如何收到数据 串口中断处理程序s3c2

[国嵌攻略][140][触摸屏驱动分析]

触摸屏驱动分析 初始化 1.使能ADC时钟 2.将物理地址转化为虚拟地址 3.让触摸屏进入等待中断模式 4.分配输入设备结构 5.设置可能上报的事件类型和按键类型 6.为TC和ADC中断注册处理函数 7.注册输入型设备 按下处理 1.判断按下或弹起 2.如果是按下情况,那么启动XY坐标的AD转换 3.进行4次ADC转换,获取4次XY坐标值 4.计算4次采集的平均值,并上报给内核

[国嵌攻略][133][网卡驱动架构分析]

Linux网络子系统 1.系统调用接口:提供系统调用 2.协议无关接口:统一网络协议给系统调用接口使用 3.网络协议栈  :实现网络协议 4.设备无关接口:统一设备驱动程序给网络协议使用 5.设备驱动程序:实现网卡驱动 Linux驱动在内核中都有一个结构来描述,首先找到设备描述结构,然后找到设备如何注册和初始化. 网卡描述结构 在Linux内核中,每个网卡都由一个net_device结构来描述,其中一些重要成员: char name[IFNAMSIZ]   设备名,如:eth%d unsigne

[国嵌攻略][132][串口驱动实现]

如何开发Linux驱动程序 一般情况下都会有现成的驱动程序,不需要从零开始开发驱动程序.所以Linux驱动开发主要分为两个步骤:1.读得懂驱动程序:2.写的了核心功能. 发送中断处理程序 发送中断处理函数在/drivers/serial/samsung.c的s3c24xx_serial_tx_chars 循环缓冲 struct circ_buf { char *buf; int head; int tail; }; 存数据的时候移动head,取数据的时候移动tail. static irqret

[国嵌攻略][102][内核驱动开发环境搭建]

服务器环境搭建 1.配置tftp服务器 1.1.设置tftp目录 vim /etc/xinetd.d/tftp server_args             = -s .../tftp disable                 = no 1.2.启动tftp服务 /etc/init.d/xinetd restart 2.配置nfs服务器 2.1.设置nfs目录 vim /etc/exports .../nfs *(rw,sync,no_root_squash) 2.2.启动nfs服务 /