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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? iccard.c

?? 嵌入式系統上用的SMARTCARD的驅動
?? C
?? 第 1 頁 / 共 3 頁
字號:
/************************************************************************************************
* 								
*	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/arch/44b.h>
#include <asm/arch/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			//重發重收的次數
#define RE_SEND_TIMES		3			//重發重收的次數

#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  1200000
#define REV_TS_TIMEOUT_CYCLE	  40040			//about 17.2ms. >= 40000/f =40000/3.579MHz = 11.18ms

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 unsigned long usrcard_max_cycle = TIMEOUT_MAX_CYCLE;

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<2000;i++);
}*/
//*******************************************************
//*******************************************************
static void delay_cycle(unsigned int count)
{	
	//500 cycles=148us
	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) & 0x0f7),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) & 0x0f7),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;
}
/*
static inline int ADD1(unsigned int a)
{
		__asm__(
		"mov r0, %0\n"
		"1:\n"
		"sub r0, r0, #1\n"
		"cmp r0, #0\n" 
		"bne 1b"
		: "=r"(a)
	 );
}
*/
//*******************************************************
//*******************************************************
void	delay_half_etu_usr(void)
{	// about 52u	//40MHz
	int i;
	for(i=0;i<760;i++);//760 101
	//ADD1(700);
}
//*******************************************************
//*******************************************************
void	delay_half_etu_sam(void)
{	// about 52u	//40MHz
	int i;
	for(i=0;i<594;i++);//760 101
	//ADD1(700);
}
//*******************************************************
//*******************************************************
void	delay_one_etu(void)
{	// about 104u	//40MHz
	int i;
	for(i=0;i<1515;i++);//1510  199us
	//ADD1(1400);
}
//*******************************************************
//*******************************************************
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;
	delay_cycle(100);
	while ( re_send_times < RE_SEND_TIMES )
	{
			
		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
		CARD_TX_SET;
		delay_half_etu_usr();
		if (card_selected==SAMCARD) delay_one_etu();		//0.5etu
		if ( CARD_RX ) 
		{		// send protect bit	
			delay_one_etu();  //12 etu
			CARD_TX_SET;
			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
		CARD_TX_SET;
		re_send_times++;
	}
	return PARITY2_ERR;
}
//*******************************************************
//*******************************************************
static int EVOC_rev_one_byte(unsigned char * rev_data, unsigned int timeout, int rev_TS){

	unsigned char * revdata;
	//unsigned char temp;
	unsigned int i,count;
	int re_rev_times;
	unsigned char parity_bit;
	int card_logic_mode;
	
	if (card_selected==SAMCARD) 
	{
		card_logic_mode = logic_mode_sam;		
	}
	else if(card_selected==USRCARD)
	{
		card_logic_mode = logic_mode_usr;
	}
	else return NO_SELECTED_CARD_ERR;
	
	re_rev_times = 0;
	revdata = rev_data;
	
	while ( re_rev_times < RE_REVEIVE_TIMES )
	{		
		count = 0;
		CARD_TX_SET;
		while ( CARD_RX )
		{
			count++;
			if (count>=timeout) 
			{				
					return TIMEROUT_ERR;
			}
		}
	
		if (card_selected==SAMCARD) delay_half_etu_sam();		//0.5etu
		else delay_half_etu_usr();
		for( i=0;i<8;i++)
		{		// receive 8 bits data
			delay_one_etu();	//1.5etu - 8.5etu
			if ( card_logic_mode == POSITIVE_LOGIC )
			{
				if ( CARD_RX )
				{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲av在线| 欧美老肥妇做.爰bbww| 韩国中文字幕2020精品| 国产成人精品一区二区三区四区 | 亚洲在线成人精品| 在线亚洲精品福利网址导航| 亚洲国产精品久久人人爱| 日本精品免费观看高清观看| 天涯成人国产亚洲精品一区av| 日韩午夜中文字幕| 国产精品中文欧美| 国产精品伦理一区二区| 91高清视频在线| 日本美女一区二区三区视频| 久久先锋资源网| 91香蕉视频黄| 日韩av在线播放中文字幕| 国产午夜精品久久久久久久| 色香色香欲天天天影视综合网 | 美女视频黄 久久| 亚洲国产成人在线| 4438成人网| 国产a久久麻豆| 亚洲国产一区二区a毛片| 精品国产乱码久久久久久老虎| 波多野结衣亚洲一区| 午夜精品福利视频网站| 国产欧美一区二区精品婷婷| 欧美日韩一区二区电影| 国产精品正在播放| 亚洲成人av资源| 国产欧美综合色| 欧美日韩精品二区第二页| 韩国v欧美v日本v亚洲v| 亚洲另类春色校园小说| 精品国产一区二区三区av性色| 99在线精品免费| 久久精品99国产精品| 亚洲精品视频免费观看| 国产午夜精品理论片a级大结局| 欧美性大战久久久久久久| 粉嫩av一区二区三区粉嫩| 午夜电影久久久| 亚洲色图在线播放| 国产日韩欧美精品综合| 91精品国产丝袜白色高跟鞋| 一本大道久久a久久精二百| 国产精品一级二级三级| 青青草97国产精品免费观看| 亚洲欧洲综合另类在线| 国产午夜精品福利| 伊人色综合久久天天| 久久品道一品道久久精品| 欧美精选午夜久久久乱码6080| 成人成人成人在线视频| 久久99国产乱子伦精品免费| 亚洲图片欧美一区| 亚洲激情网站免费观看| 国产精品国产三级国产普通话蜜臀 | 亚洲伦在线观看| 国产拍揄自揄精品视频麻豆| 精品999在线播放| 91麻豆精品国产自产在线观看一区 | 精品国产伦一区二区三区免费| 欧美日韩电影在线| a亚洲天堂av| 成人av电影在线观看| 国产成人免费在线视频| 国产精品资源网| 国产麻豆日韩欧美久久| 久久国产人妖系列| 精品一区二区三区免费观看| 美女看a上一区| 蜜桃久久精品一区二区| 日本不卡高清视频| 久久精品国产秦先生| 久久99国产乱子伦精品免费| 狠狠久久亚洲欧美| 国产一区二区三区国产| 国产一区二区精品久久91| 麻豆精品视频在线观看免费 | 一区二区三区国产精华| 一区二区三区电影在线播| 亚洲成人av一区二区| 日韩精品久久理论片| 精品一区二区影视| 国产高清成人在线| 91亚洲永久精品| 欧美在线你懂的| 欧美一区二区三区四区视频| 91精品国产综合久久久久久| 欧美电影免费观看高清完整版在线| 91精品国产日韩91久久久久久| 欧美大胆一级视频| 欧美激情在线观看视频免费| 亚洲婷婷综合久久一本伊一区| 一区二区高清免费观看影视大全| 亚洲综合色网站| 日韩**一区毛片| 国产激情偷乱视频一区二区三区| www.日韩大片| 在线观看91av| 国产精品你懂的| 亚洲成人精品影院| 极品尤物av久久免费看| 91麻豆国产香蕉久久精品| 91精品一区二区三区在线观看| 精品少妇一区二区三区在线视频| 国产精品人妖ts系列视频| 亚洲成人av福利| 国产成人av电影在线观看| 一本大道久久a久久综合婷婷| 51精品秘密在线观看| 国产美女主播视频一区| 99久久er热在这里只有精品15| 欧美日韩电影在线播放| 中文字幕免费不卡| 奇米四色…亚洲| 97se亚洲国产综合自在线| 欧美一区二区三区成人| 国产精品色眯眯| 日韩av中文字幕一区二区| 成人av资源在线观看| 日韩欧美美女一区二区三区| 中文字幕一区二区三区在线播放| 青青草原综合久久大伊人精品| 99精品视频免费在线观看| 欧美一级夜夜爽| 中文字幕亚洲综合久久菠萝蜜| 免费高清在线一区| 91黄色激情网站| 久久久精品人体av艺术| 五月天欧美精品| av不卡一区二区三区| 精品国产91乱码一区二区三区 | 中文字幕精品一区二区三区精品| 一区二区三区.www| 粉嫩av一区二区三区在线播放| 这里只有精品99re| 亚洲一区在线视频| av爱爱亚洲一区| 国产精品天天摸av网| 日本不卡的三区四区五区| 欧美午夜精品一区二区蜜桃| 国产精品视频一二三| 精品无码三级在线观看视频| 欧美精品日韩综合在线| 一区二区三区日韩精品| aaa国产一区| 国产亚洲短视频| 黑人巨大精品欧美一区| 日韩欧美一区二区在线视频| 一区二区三区不卡在线观看| 91污在线观看| 亚洲男人的天堂在线观看| 成人激情黄色小说| 国产精品视频看| 国产精品1区2区| 日本一区二区三区免费乱视频 | 日韩亚洲欧美高清| 天堂成人国产精品一区| 欧美日韩国产首页在线观看| 一区二区日韩电影| 欧美色中文字幕| 亚洲高清在线精品| 欧美丰满少妇xxxxx高潮对白| 亚洲高清免费观看高清完整版在线观看| 91婷婷韩国欧美一区二区| 中文字幕一区二区三区不卡在线| 成人一二三区视频| 国产精品无人区| 成人国产精品免费网站| 亚洲欧美一区二区三区国产精品| 99久久国产综合精品麻豆| 亚洲久草在线视频| 欧美色成人综合| 日本在线不卡视频| 久久蜜桃av一区二区天堂| 国产激情视频一区二区三区欧美| 国产亚洲成av人在线观看导航| 成人一区二区三区| 亚洲男人的天堂av| 欧美日韩精品欧美日韩精品| 麻豆91小视频| 国产亲近乱来精品视频| 91视频你懂的| 一本一道久久a久久精品综合蜜臀| 一区二区三区日韩欧美精品| 91精品一区二区三区久久久久久| 久久精品国产免费看久久精品| 精品久久久三级丝袜| 成人深夜在线观看| 亚洲国产wwwccc36天堂| 日韩欧美激情一区| 不卡的av网站| 亚洲高清一区二区三区| 久久综合色鬼综合色| 色悠悠亚洲一区二区| 蜜臀a∨国产成人精品| 国产清纯白嫩初高生在线观看91 |