亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? iccard0911.c

?? 嵌入式系統(tǒng)上用的SMARTCARD的驅(qū)動(dòng)
?? C
?? 第 1 頁 / 共 3 頁
字號(hào):
/************************************************************************************************
* 								
*	Copyright (C) EVOC  Co., LTD. 2003		
*								
*	File name:	IcCard.c				
*	Description:    
*	  							
*	Revision history					
*               2006.05.17      Zou Hong Bo	start.	
*								
************************************************************************************************/
/* Include files--------------------------------------------------------------*/
 
//#include "iccard_hw.h"
#include <linux/version.h>
#include <linux/kernel.h>     /* We're doing kernel work */
#include <linux/module.h>     /* Specifically, a module */ 
#include <linux/interrupt.h>  /* We want interrupts */

#include <linux/miscdevice.h> /* for misc_register() and misc_deregister() */

#include <linux/fs.h>         /* for struct 'file_operations' */

#include <linux/timer.h>     /* for timeout interrupts */
#include <linux/param.h>     /* for HZ. HZ = 100 and the timer step is 1/100 */
#include <linux/sched.h>     /* for jiffies definition. jiffies is incremented*/
                              /* once for each clock tick; thus it's incremented*/			      
                              /* HZ times per secondes.*/
#include <linux/mm.h>        /* for verify_area */
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/iccard.h>

#include <asm/irq.h>         /* For IRQ_MACHSPEC */
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/arch/irqs.h>
#include <asm/arch/hardware.h>
#include <asm/44b.h>
#include <asm/def.h>



#define DEBUG_ICCARD	// for debug only
//#define NULL 0

#define	CPU_CARD	0x01
#define	SAM_CARD	0x02

#define	CPU_CARD_POW	(1<<3)
#define	SAM_CARD_POW	(1<<2)

#define	CPU_CARD_RST	(1<<6)
#define	SAM_CARD_RST	(1)

#define IC_LED_POW    (1<<8)

//#define	TIMEROUT_ERR	0xff
#define	MAX_TIME_OUT	0XFFF0
#define	CARD_OUT	(1<<12)
#define	CARD_IN	(1<<13)

//#define CARD_RX 		(rPDATC&CARD_IN	)? 1:0	
//#define CARD_TX_SET		rPDATC = rPDATC|CARD_OUT
//#define CARD_TX_CLR		rPDATC = rPDATC&(~CARD_OUT)

#define CARD_RX 		(inl(S3C44B0X_PDATC) & CARD_IN	)? 1:0	
#define CARD_TX_SET		outl(inl(S3C44B0X_PDATC) | CARD_OUT,S3C44B0X_PDATC)
#define CARD_TX_CLR		outl(inl(S3C44B0X_PDATC) &(~CARD_OUT),S3C44B0X_PDATC)

#define RE_REVEIVE_TIMES	3			//重發(fā)重收的次數(shù)
#define RE_SEND_TIMES		3			//重發(fā)重收的次數(shù)

#define etu_time_all  0x2ac
#define etu_time_half  0x366


#define ATR_MAX_LEN		32			//max atr len

#define TS_BIT		1
#define NOT_TS_BIT	0

#define LAST_BYTE		1
#define NOT_LAST_BYTE		0

#define POSITIVE_LOGIC	0
#define NEGATIVE_LOGIC	1

#define EVOC_ICCARD_BUF_SIZE 1024

#define TIMEOUT_MAX_CYCLE  (360000*TC2_WI)			//120000 about 1s 960etu
#define REV_TS_TIMEOUT_CYCLE	  180000	

static struct ICCARDFIFO {
	unsigned char buffer[EVOC_ICCARD_BUF_SIZE];
	int len;
}iccardfifo;

#ifdef CONFIG_DEVFS_FS 
	static devfs_handle_t devfs_IC_dir,devfs_ICraw;
#endif

#define IC_MAJOR   115
#define IC_MINOR   0
#define DEVICE_NAME    "s3c44b0ic"

static int TC2_WI = 10;

static int logic_mode_sam = POSITIVE_LOGIC;
static int logic_mode_usr = POSITIVE_LOGIC;

static unsigned char protect_time_sam = 0;
static unsigned char protect_time_usr = 0;

static int samcard_err = -1;
static int usrcard_err = -1;

static int card_selected=NONECARD;

unsigned char iccard_ctr=0;

static const char* __file__ = __FILE__;
static int    iccard_device_open = 0;   /* number of open device to prevent concurrent*/
                                         /* access to the same device */
static char time_flag=0;
//*******************************************************
//*******************************************************
static unsigned char swapbits(unsigned char i) 
{
  return i >> 7
       | (i & 0x40) >> 5
       | (i & 0x20) >> 3
       | (i & 0x10) >> 1
       | (i & 0x08) << 1
       | (i & 0x04) << 3
       | (i & 0x02) << 5
       | i << 7;
}

//*******************************************************
//*******************************************************
static void EVOC_LED_ON(void)
{
	outl((inl(S3C44B0X_PDATC) & (~IC_LED_POW )),S3C44B0X_PDATC);
	
}
//*******************************************************
//*******************************************************
static void EVOC_LED_OFF(void)
{
	outl((inl(S3C44B0X_PDATC) | (IC_LED_POW)),S3C44B0X_PDATC);
}
//*******************************************************
//*******************************************************
static void etu_time_handle(int irq,void *dev_id,struct pt_regs *regs)
{
		time_flag = 1;
		printk("input time interrupt\n");
		//outl(0x777, S3C44B0X_TCNTB1);
		s3c44b0x_clear_pb(S3C44B0X_INTERRUPT_TIMER1);
		//outl(0x1000, S3C44B0X_F_ISPC);
}
//*******************************************************
//*******************************************************
static void delay_1200_cycle(void)
{	
	//500 cycles=148us
	int i;
	for(i=0;i<3000;i++);
}
//*******************************************************
//*******************************************************
static void delay_cycle(unsigned int count)
{	
	//500 cycles=148us
	//int i;
	for(;count>0;count--);
}
//*******************************************************
//*******************************************************
static void EVOC_iccard_set_port(void)
{
		u_int32_t tmod;
		outl(0xf1555555,S3C44B0X_PCONC);
		//rPCONC = 0xf1555555;	// rxd1 as input; txd1 as output
								// pc12 is txd1; pc13 is rxd1
		outl(0xF9FF,S3C44B0X_PDATC);						
		//rPDATC = 0xF9FF;
		tmod = inl(S3C44B0X_PCONE);
		tmod &= ~(0x03<<6);
		tmod |= 0x01<<6;
		tmod &= ~(0x03<<16);
		tmod |= 0x01<<16;
				
		outl(tmod,S3C44B0X_PCONE);
		
		outl((inl(S3C44B0X_PDATE) & 0x77),S3C44B0X_PDATE);
		
		tmod = inl(S3C44B0X_PCONG);
		tmod &= ~(0x03<<12);
		tmod |= 0x01<<12;
				
		outl(tmod,S3C44B0X_PCONG);
		
		outl((inl(S3C44B0X_PDATG) | 0x40),S3C44B0X_PDATG);
		
		// zhp add 20060608 for GPF6
		outl(0X8040A,S3C44B0X_PCONF);
		outl(0X14F,S3C44B0X_PDATF);
		//rPCONF = 0X8040A;		     
		//rPDATF = 0X14F;

}
//*******************************************************
//*******************************************************
static void EVOC_select_usr(void)
{
	outl((inl(S3C44B0X_PDATE) | 0x08),S3C44B0X_PDATE);
}
//*******************************************************
//*******************************************************
static void EVOC_select_sam(void)
{
	outl((inl(S3C44B0X_PDATE) & 0x77),S3C44B0X_PDATE);
}
//*******************************************************
//*******************************************************
static void EVOC_usr_set_card_rst(void)
{
	//outl(inl(S3C44B0X_PDATE) | 0x08,S3C44B0X_PDATE);
	outl((inl(S3C44B0X_PDATG) & (~CPU_CARD_RST)),S3C44B0X_PDATG);
}
//*******************************************************
//*******************************************************
static void EVOC_usr_clr_card_rst(void)
{
	//outl(inl(S3C44B0X_PDATE) | 0x08,S3C44B0X_PDATE);
	outl((inl(S3C44B0X_PDATG) | (CPU_CARD_RST)),S3C44B0X_PDATG);
}
//*******************************************************
//*******************************************************
static void EVOC_usr_card_pwr_off(void)
{
	outl((inl(S3C44B0X_PDATC) | (CPU_CARD_POW)),S3C44B0X_PDATC);
	EVOC_LED_OFF();
}
//*******************************************************
//*******************************************************
static void EVOC_usr_card_pwr_on(void)
{
	outl((inl(S3C44B0X_PDATC) & (~CPU_CARD_POW)),S3C44B0X_PDATC);
	EVOC_LED_ON();
}
//*******************************************************
//*******************************************************
static void EVOC_sam_set_card_rst(void)
{
	//outl(inl(S3C44B0X_PDATE) & 0x77,S3C44B0X_PDATE);
	outl((inl(S3C44B0X_PDATC) & (~SAM_CARD_RST)),S3C44B0X_PDATC);
}
//*******************************************************
//*******************************************************
static void EVOC_sam_clr_card_rst(void){
	//outl(inl(S3C44B0X_PDATE) & 0x77,S3C44B0X_PDATE);
	outl((inl(S3C44B0X_PDATC) | (SAM_CARD_RST)),S3C44B0X_PDATC);
}
//*******************************************************
//*******************************************************
static void EVOC_sam_card_pwr_off(void){
	outl((inl(S3C44B0X_PDATC) | (SAM_CARD_POW)),S3C44B0X_PDATC);
	EVOC_LED_OFF();
}
//*******************************************************
//*******************************************************
static void EVOC_sam_card_pwr_on(void){
	outl((inl(S3C44B0X_PDATC) & (~SAM_CARD_POW)),S3C44B0X_PDATC);
	EVOC_LED_ON();
}

//*******************************************************
//*******************************************************
static void EVOC_sam_card_release(void){
	EVOC_sam_clr_card_rst();
	EVOC_sam_card_pwr_off();
	iccardfifo.len = 0;
}
//*******************************************************
//*******************************************************
static void EVOC_usr_card_release(void){
	EVOC_usr_clr_card_rst();
	EVOC_usr_card_pwr_off();
	iccardfifo.len = 0;		

}
//*******************************************************
//*******************************************************
int EVOC_show_card_err_msg(int errcode){
	printk("\nerrcode = %d ,  ",errcode); 
	if (errcode>=0){
		printk("OK!\n"); 	
	}
	else if (errcode == TIMEROUT_ERR) {
		printk("Time out err\n"); 
	}
	else if (errcode == PARITY1_ERR) {
		printk("receive parity err\n"); 
	}
	else if (errcode == PARITY2_ERR) {
		printk("send parity err\n"); 
	}
	else if (errcode == CARD_ERR) {
		printk("card err, not cpu card\n"); 
	}
	else if (errcode == ATR_LEN_ERR) {
		printk("card response len err\n"); 
	}
	else if (errcode == ATR_XOR_ERR) {
		printk("card response parity err\n"); 
	}
	else if (errcode == NO_SELECTED_CARD_ERR) {
		printk("No card be selected err\n"); 
	}
	else if (errcode == ADPU_ERR) {
		printk("ADPU CMD format err\n"); 
	}
	else if (errcode == NO_CARD_ERR) {
		printk("No card in card slot err\n"); 
	}
	else { 
		printk("other  err\n"); 
	}
	return 0;
}
//*******************************************************
//*******************************************************
void	delay_half_etu(void)
{	// about 52u	//40MHz
	int i;
	for(i=0;i<730;i++);//768
}
//*******************************************************
//*******************************************************
void	delay_one_etu(void)
{	// about 104u	//40MHz
	int i;
	for(i=0;i<1500;i++);//1547
}
//*******************************************************
//*******************************************************
static int EVOC_send_one_byte(unsigned char * send_data, int send_last_byte){

	int i;
	unsigned char senddata;
	int re_send_times;
	int send_parity_bit;
	unsigned char protect_time=0;

	re_send_times = 0;

	if (card_selected==SAMCARD) {
		protect_time = protect_time_sam;
		if (logic_mode_sam == NEGATIVE_LOGIC) {
			senddata =  swapbits(*send_data);
		}
		else{
			senddata =  (*send_data);
		}
	}
	else if(card_selected==USRCARD){
		protect_time = protect_time_usr;
		if (logic_mode_usr == NEGATIVE_LOGIC){
			senddata =  swapbits(*send_data);
		}
		else {
			senddata =  (*send_data);
		}
	}
	else return NO_SELECTED_CARD_ERR;

	send_parity_bit =  ( (  senddata         >> 7)
			    ^( (senddata & 0x40) >> 6)
			    ^( (senddata & 0x20) >> 5)
			    ^( (senddata & 0x10) >> 4)
			    ^( (senddata & 0x08) >> 3)
		            ^( (senddata & 0x04) >> 2)
		            ^( (senddata & 0x02) >> 1)
		            ^( (senddata & 0x01)     ) ); 
		            
//	if (senddata==0x84) send_parity_bit=1;
	
	CARD_TX_SET;
	
	while ( re_send_times < RE_SEND_TIMES )
	{
		if (card_selected==SAMCARD) 
		{
			//EVOC_select_sam();		
		}
		else if(card_selected==USRCARD)
		{
			//EVOC_select_usr();	
		}
		else return NO_SELECTED_CARD_ERR;	
			
		CARD_TX_CLR;	//start bit
		delay_one_etu();	// 1 etu
		
		for(i=0;i<8;i++)
		{	//8 bit data
			if ( (senddata>>i)&0x01 ) 
				CARD_TX_SET;
			else 	
				CARD_TX_CLR;

			delay_one_etu();	//2 - 9 etu
		}
			
		if ( send_parity_bit ) 		//parity bit
			CARD_TX_SET;
		else 	
			CARD_TX_CLR;
		delay_one_etu();		//10 etu
	
		delay_one_etu();		//11 etu
		
		if ( CARD_RX ) 
		{		// send protect bit	
			delay_one_etu();  //12 etu
			
			if (send_last_byte==LAST_BYTE)
				return 0;
			if ( (protect_time==0)||(protect_time==0xff) )
				return 0;
			else
			{
				for(i=0;i<protect_time;i++)
				{
					delay_one_etu(); 	// 13 ~ (12+N) etu
				}
				return 0;
			}
		}

		delay_one_etu();	//12 etu, send err
		delay_one_etu();	//13 etu
		re_send_times++;
	}
	return PARITY2_ERR;
}
//*******************************************************

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品中文字幕乱码三区| 国产一区三区三区| 亚洲自拍都市欧美小说| 亚洲日本韩国一区| 国产精品私人影院| 中文字幕不卡三区| 中文字幕日本乱码精品影院| 国产精品女同互慰在线看| 欧美国产精品一区| 欧美激情艳妇裸体舞| 久久综合九色综合久久久精品综合 | 亚洲蜜臀av乱码久久精品蜜桃| 中日韩av电影| 一区在线播放视频| 一区二区三区在线免费视频| **欧美大码日韩| 一区二区三区在线观看视频| 亚洲综合在线五月| 天天综合色天天综合色h| 午夜成人免费电影| 久久成人综合网| 狠狠色丁香久久婷婷综| 国产一区视频在线看| 国产电影一区二区三区| 成人激情文学综合网| 一本色道综合亚洲| 欧美精品久久久久久久多人混战 | 日韩视频永久免费| 精品久久久久久久久久久久久久久久久| 2024国产精品视频| 中文字幕第一区第二区| 亚洲精选一二三| 午夜精品久久久久久久蜜桃app| 免费在线观看一区二区三区| 久久97超碰国产精品超碰| 国产精品系列在线播放| 99国产精品久| 欧美日韩激情一区| 精品日韩一区二区三区免费视频| 亚洲国产精品精华液ab| 亚洲一二三四在线| 激情五月婷婷综合网| 91在线视频播放| 91精品久久久久久久99蜜桃 | 免费在线观看成人| 国产精品77777竹菊影视小说| 91在线免费播放| 日韩欧美一区二区久久婷婷| 国产精品久久网站| 日精品一区二区三区| 国内久久精品视频| 91美女片黄在线| 日韩一区二区高清| 亚洲天天做日日做天天谢日日欢| 天天综合色天天| caoporen国产精品视频| 欧美精品xxxxbbbb| 国产精品三级电影| 日韩国产欧美视频| 99久久久国产精品| 日韩欧美一级在线播放| 亚洲精品成人少妇| 国产一区二区伦理| 欧美日韩免费一区二区三区| 国产午夜亚洲精品不卡| 亚洲成人免费视频| 国产91在线|亚洲| 欧美一区日韩一区| 亚洲精品成人在线| 成人高清在线视频| 精品国产免费视频| 三级久久三级久久久| 91猫先生在线| 欧美国产在线观看| 韩国欧美一区二区| 欧美日韩久久久久久| 国产精品成人免费精品自在线观看| 日本不卡中文字幕| 欧美三级电影网站| 亚洲欧洲无码一区二区三区| 精品无人码麻豆乱码1区2区| 欧美午夜精品电影| 国产精品毛片a∨一区二区三区| 激情综合一区二区三区| 欧美精品乱码久久久久久 | 国产91精品精华液一区二区三区 | 成人欧美一区二区三区白人| 国产麻豆精品在线| 精品久久久久久无| 免费观看日韩电影| 69av一区二区三区| 亚洲国产一区二区三区| 99久精品国产| 国产精品网站一区| 丁香亚洲综合激情啪啪综合| 精品国产乱码久久久久久久| 日韩av网站免费在线| 欧美日韩不卡在线| 亚洲成人一二三| 欧美三级中文字幕在线观看| 一区二区高清免费观看影视大全| 99久久久无码国产精品| 中文字幕在线不卡国产视频| 国产sm精品调教视频网站| 国产日韩av一区| 国产.欧美.日韩| 中文一区一区三区高中清不卡| 国产激情一区二区三区四区 | 亚洲最大的成人av| 欧美午夜理伦三级在线观看| 亚洲成人av免费| 欧美一区二区三区精品| 日韩电影在线观看电影| 日韩欧美一级在线播放| 国产在线不卡一卡二卡三卡四卡| 精品美女一区二区三区| 国产高清不卡二三区| 国产亚洲成av人在线观看导航| 国产不卡视频一区二区三区| 亚洲国产精品高清| 91热门视频在线观看| 亚洲精品亚洲人成人网| 欧美少妇性性性| 奇米综合一区二区三区精品视频| 精品91自产拍在线观看一区| 国产二区国产一区在线观看| 亚洲三级在线看| 欧美午夜精品一区二区三区| 欧美aa在线视频| 中文字幕成人网| 欧美日韩一级二级| 蜜臀精品久久久久久蜜臀| 久久综合久久综合九色| 99久久伊人精品| 日欧美一区二区| 国产网站一区二区| 日本高清免费不卡视频| 日本美女一区二区| 中文欧美字幕免费| 欧美婷婷六月丁香综合色| 人人爽香蕉精品| 国产精品三级视频| 91 com成人网| 成人激情校园春色| 偷拍自拍另类欧美| 国产日韩av一区| 欧美日韩国产精选| 粉嫩蜜臀av国产精品网站| 亚洲永久精品国产| 国产亚洲va综合人人澡精品| 欧美午夜宅男影院| 国产福利不卡视频| 日韩精品一区第一页| 国产精品污网站| 欧美一区二区在线播放| jiyouzz国产精品久久| 日韩国产精品久久| 亚洲天堂精品在线观看| 日韩欧美一级在线播放| 日本精品裸体写真集在线观看| 精品一区二区三区免费播放| 亚洲老妇xxxxxx| 久久久久88色偷偷免费| 欧美久久久久久久久中文字幕| 成人黄色av电影| 乱一区二区av| 亚洲一区二区三区四区在线观看 | 国产老女人精品毛片久久| 一区二区三区欧美日| 久久亚洲一区二区三区四区| 欧美亚洲尤物久久| 欧美不卡一区二区三区| 在线观看日韩av先锋影音电影院| 国产麻豆精品久久一二三| 亚洲成精国产精品女| 国产精品久久久久婷婷| 欧美成人一区二区三区片免费 | 99这里只有久久精品视频| 美国毛片一区二区三区| 亚洲综合精品久久| 日韩毛片精品高清免费| 久久久久综合网| 日韩免费高清av| 91精品国产一区二区三区| 91热门视频在线观看| 成人黄色电影在线| 国产91丝袜在线播放| 国产在线不卡一卡二卡三卡四卡| 秋霞午夜av一区二区三区| 亚洲国产视频a| 亚洲激情图片小说视频| 国产精品久久久久久久久搜平片 | 91精品欧美久久久久久动漫| 91精品办公室少妇高潮对白| 成人动漫av在线| 国产成人av一区| 国产成人在线电影| 国产一区二区三区在线看麻豆| 免费看日韩a级影片| 丝袜美腿亚洲色图|