⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 via-ircc.h

📁 《linux驱动程序设计从入门到精通》一书中所有的程序代码含驱动和相应的应用程序
💻 H
📖 第 1 页 / 共 2 页
字号:
		high = (count & 0x0f00) >> 8;		WriteReg(iobase, TX_C_L, low);		WriteReg(iobase, TX_C_H, high);	}}static void ResetChip(__u16 iobase, __u8 type){	__u8 value;	value = (type + 2) << 4;	WriteReg(iobase, RESET, type);}static int CkRxRecv(__u16 iobase, struct via_ircc_cb *self){	__u8 low, high;	__u16 wTmp = 0, wTmp1 = 0, wTmp_new = 0;	low = ReadReg(iobase, RX_C_L);	high = ReadReg(iobase, RX_C_H);	wTmp1 = high;	wTmp = (wTmp1 << 8) | low;	udelay(10);	low = ReadReg(iobase, RX_C_L);	high = ReadReg(iobase, RX_C_H);	wTmp1 = high;	wTmp_new = (wTmp1 << 8) | low;	if (wTmp_new != wTmp)		return 1;	else		return 0;}static __u16 RxCurCount(__u16 iobase, struct via_ircc_cb * self){	__u8 low, high;	__u16 wTmp = 0, wTmp1 = 0;	low = ReadReg(iobase, RX_P_L);	high = ReadReg(iobase, RX_P_H);	wTmp1 = high;	wTmp = (wTmp1 << 8) | low;	return wTmp;}/* This Routine can only use in recevie_complete * for it will update last count. */static __u16 GetRecvByte(__u16 iobase, struct via_ircc_cb * self){	__u8 low, high;	__u16 wTmp, wTmp1, ret;	low = ReadReg(iobase, RX_P_L);	high = ReadReg(iobase, RX_P_H);	wTmp1 = high;	wTmp = (wTmp1 << 8) | low;	if (wTmp >= self->RxLastCount)		ret = wTmp - self->RxLastCount;	else		ret = (0x8000 - self->RxLastCount) + wTmp;	self->RxLastCount = wTmp;/* RX_P is more actually the RX_C low=ReadReg(iobase,RX_C_L); high=ReadReg(iobase,RX_C_H); if(!(high&0xe000)) {	 temp=(high<<8)+low;	 return temp; } else return 0;*/	return ret;}static void Sdelay(__u16 scale){	__u8 bTmp;	int i, j;	for (j = 0; j < scale; j++) {		for (i = 0; i < 0x20; i++) {			bTmp = inb(0xeb);			outb(bTmp, 0xeb);		}	}}static void Tdelay(__u16 scale){	__u8 bTmp;	int i, j;	for (j = 0; j < scale; j++) {		for (i = 0; i < 0x50; i++) {			bTmp = inb(0xeb);			outb(bTmp, 0xeb);		}	}}static void ActClk(__u16 iobase, __u8 value){	__u8 bTmp;	bTmp = ReadReg(iobase, 0x34);	if (value)		WriteReg(iobase, 0x34, bTmp | Clk_bit);	else		WriteReg(iobase, 0x34, bTmp & ~Clk_bit);}static void ClkTx(__u16 iobase, __u8 Clk, __u8 Tx){	__u8 bTmp;	bTmp = ReadReg(iobase, 0x34);	if (Clk == 0)		bTmp &= ~Clk_bit;	else {		if (Clk == 1)			bTmp |= Clk_bit;	}	WriteReg(iobase, 0x34, bTmp);	Sdelay(1);	if (Tx == 0)		bTmp &= ~Tx_bit;	else {		if (Tx == 1)			bTmp |= Tx_bit;	}	WriteReg(iobase, 0x34, bTmp);}static void Wr_Byte(__u16 iobase, __u8 data){	__u8 bData = data;//      __u8 btmp;	int i;	ClkTx(iobase, 0, 1);	Tdelay(2);	ActClk(iobase, 1);	Tdelay(1);	for (i = 0; i < 8; i++) {	//LDN		if ((bData >> i) & 0x01) {			ClkTx(iobase, 0, 1);	//bit data = 1;		} else {			ClkTx(iobase, 0, 0);	//bit data = 1;		}		Tdelay(2);		Sdelay(1);		ActClk(iobase, 1);	//clk hi		Tdelay(1);	}}static __u8 Rd_Indx(__u16 iobase, __u8 addr, __u8 index){	__u8 data = 0, bTmp, data_bit;	int i;	bTmp = addr | (index << 1) | 0;	ClkTx(iobase, 0, 0);	Tdelay(2);	ActClk(iobase, 1);	udelay(1);	Wr_Byte(iobase, bTmp);	Sdelay(1);	ClkTx(iobase, 0, 0);	Tdelay(2);	for (i = 0; i < 10; i++) {		ActClk(iobase, 1);		Tdelay(1);		ActClk(iobase, 0);		Tdelay(1);		ClkTx(iobase, 0, 1);		Tdelay(1);		bTmp = ReadReg(iobase, 0x34);		if (!(bTmp & Rd_Valid))			break;	}	if (!(bTmp & Rd_Valid)) {		for (i = 0; i < 8; i++) {			ActClk(iobase, 1);			Tdelay(1);			ActClk(iobase, 0);			bTmp = ReadReg(iobase, 0x34);			data_bit = 1 << i;			if (bTmp & RxBit)				data |= data_bit;			else				data &= ~data_bit;			Tdelay(2);		}	} else {		for (i = 0; i < 2; i++) {			ActClk(iobase, 1);			Tdelay(1);			ActClk(iobase, 0);			Tdelay(2);		}		bTmp = ReadReg(iobase, 0x34);	}	for (i = 0; i < 1; i++) {		ActClk(iobase, 1);		Tdelay(1);		ActClk(iobase, 0);		Tdelay(2);	}	ClkTx(iobase, 0, 0);	Tdelay(1);	for (i = 0; i < 3; i++) {		ActClk(iobase, 1);		Tdelay(1);		ActClk(iobase, 0);		Tdelay(2);	}	return data;}static void Wr_Indx(__u16 iobase, __u8 addr, __u8 index, __u8 data){	int i;	__u8 bTmp;	ClkTx(iobase, 0, 0);	udelay(2);	ActClk(iobase, 1);	udelay(1);	bTmp = addr | (index << 1) | 1;	Wr_Byte(iobase, bTmp);	Wr_Byte(iobase, data);	for (i = 0; i < 2; i++) {		ClkTx(iobase, 0, 0);		Tdelay(2);		ActClk(iobase, 1);		Tdelay(1);	}	ActClk(iobase, 0);}static void ResetDongle(__u16 iobase){	int i;	ClkTx(iobase, 0, 0);	Tdelay(1);	for (i = 0; i < 30; i++) {		ActClk(iobase, 1);		Tdelay(1);		ActClk(iobase, 0);		Tdelay(1);	}	ActClk(iobase, 0);}static void SetSITmode(__u16 iobase){	__u8 bTmp;	bTmp = ReadLPCReg(0x28);	WriteLPCReg(0x28, bTmp | 0x10);	//select ITMOFF	bTmp = ReadReg(iobase, 0x35);	WriteReg(iobase, 0x35, bTmp | 0x40);	// Driver ITMOFF	WriteReg(iobase, 0x28, bTmp | 0x80);	// enable All interrupt}static void SI_SetMode(__u16 iobase, int mode){	//__u32 dTmp;	__u8 bTmp;	WriteLPCReg(0x28, 0x70);	// S/W Reset	SetSITmode(iobase);	ResetDongle(iobase);	udelay(10);	Wr_Indx(iobase, 0x40, 0x0, 0x17);	//RX ,APEN enable,Normal power	Wr_Indx(iobase, 0x40, 0x1, mode);	//Set Mode	Wr_Indx(iobase, 0x40, 0x2, 0xff);	//Set power to FIR VFIR > 1m	bTmp = Rd_Indx(iobase, 0x40, 1);}static void InitCard(__u16 iobase){	ResetChip(iobase, 5);	WriteReg(iobase, I_ST_CT_0, 0x00);	// open CHIP on	SetSIRBOF(iobase, 0xc0);	// hardware default value	SetSIREOF(iobase, 0xc1);}static void CommonInit(__u16 iobase){//  EnTXCRC(iobase,0);	SwapDMA(iobase, OFF);	SetMaxRxPacketSize(iobase, 0x0fff);	//set to max:4095	EnRXFIFOReadyInt(iobase, OFF);	EnRXFIFOHalfLevelInt(iobase, OFF);	EnTXFIFOHalfLevelInt(iobase, OFF);	EnTXFIFOUnderrunEOMInt(iobase, ON);//  EnTXFIFOReadyInt(iobase,ON);	InvertTX(iobase, OFF);	InvertRX(iobase, OFF);//  WriteLPCReg(0xF0,0); //(if VT1211 then do this)	if (IsSIROn(iobase)) {		SIRFilter(iobase, ON);		SIRRecvAny(iobase, ON);	} else {		SIRFilter(iobase, OFF);		SIRRecvAny(iobase, OFF);	}	EnRXSpecInt(iobase, ON);	WriteReg(iobase, I_ST_CT_0, 0x80);	EnableDMA(iobase, ON);}static void SetBaudRate(__u16 iobase, __u32 rate){	__u8 value = 11, temp;	if (IsSIROn(iobase)) {		switch (rate) {		case (__u32) (2400L):			value = 47;			break;		case (__u32) (9600L):			value = 11;			break;		case (__u32) (19200L):			value = 5;			break;		case (__u32) (38400L):			value = 2;			break;		case (__u32) (57600L):			value = 1;			break;		case (__u32) (115200L):			value = 0;			break;		default:			break;		};	} else if (IsMIROn(iobase)) {		value = 0;	// will automatically be fixed in 1.152M	} else if (IsFIROn(iobase)) {		value = 0;	// will automatically be fixed in 4M	}	temp = (ReadReg(iobase, I_CF_H_1) & 0x03);	temp |= value << 2;	WriteReg(iobase, I_CF_H_1, temp);}static void SetPulseWidth(__u16 iobase, __u8 width){	__u8 temp, temp1, temp2;	temp = (ReadReg(iobase, I_CF_L_1) & 0x1f);	temp1 = (ReadReg(iobase, I_CF_H_1) & 0xfc);	temp2 = (width & 0x07) << 5;	temp |= temp2;	temp2 = (width & 0x18) >> 3;	temp1 |= temp2;	WriteReg(iobase, I_CF_L_1, temp);	WriteReg(iobase, I_CF_H_1, temp1);}static void SetSendPreambleCount(__u16 iobase, __u8 count){	__u8 temp;	temp = ReadReg(iobase, I_CF_L_1) & 0xe0;	temp |= count;	WriteReg(iobase, I_CF_L_1, temp);}static void SetVFIR(__u16 BaseAddr, __u8 val){	__u8 tmp;	tmp = ReadReg(BaseAddr, I_CF_L_0);	WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);	WriteRegBit(BaseAddr, I_CF_H_0, 5, val);}static void SetFIR(__u16 BaseAddr, __u8 val){	__u8 tmp;	WriteRegBit(BaseAddr, I_CF_H_0, 5, 0);	tmp = ReadReg(BaseAddr, I_CF_L_0);	WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);	WriteRegBit(BaseAddr, I_CF_L_0, 6, val);}static void SetMIR(__u16 BaseAddr, __u8 val){	__u8 tmp;	WriteRegBit(BaseAddr, I_CF_H_0, 5, 0);	tmp = ReadReg(BaseAddr, I_CF_L_0);	WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);	WriteRegBit(BaseAddr, I_CF_L_0, 5, val);}static void SetSIR(__u16 BaseAddr, __u8 val){	__u8 tmp;	WriteRegBit(BaseAddr, I_CF_H_0, 5, 0);	tmp = ReadReg(BaseAddr, I_CF_L_0);	WriteReg(BaseAddr, I_CF_L_0, tmp & 0x8f);	WriteRegBit(BaseAddr, I_CF_L_0, 4, val);}#endif				/* via_IRCC_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -