📄 via-ircc.h
字号:
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 + -