📄 read_reg.c
字号:
#include "reg51.h"
#include "read_reg.h"
#include "usbmass.h"
void _nop_ (void);
U8 gStallMark;
U32 gWaitPktTicks = UMO_WAIT_USB_PKT_TICKS; //timeout value for usb packet waiting
XD U8 gEPOUT; //out-endpoint
XD U8 gEPIN; //in-endpoint
XD U8 volatile gEP;
XD U8 gIrqEn;
XD U8 gMxPkSz; //maximum packet size (bulk)
XD U8 gMxPkSzCtr; //maximum packet size (control)
XD U8 gIFSC; //interface sub-class
XD U8 gUsbVer; //USB Version
XD U8 gUsbCfg;
XD U8 gLun; //"LUN" for USB_XXX routines
XD U8 gDevAddr;
XD U16 gVID;
XD U16 gPID;
U8 gUsbIrq; //DEV_WaitForIrq, DEV_WaitMS, WaitPacketDone
U32 msec;
U8 gInitState = IS_NO_INIT;
//////////////////////////////////////////////////////////
int enable_debug=0;
char gUsbTimeOver=0;
int gSecCnt=0;
int gSecAddr=-1;
///////////////////////////////////////////////////////////
extern XD U8 gCBW[31]; //SCSI CBW 31byte or
extern XD U8 gMaxLun; //gMaxLun = ??á??· LUN
/*
void test(void)
{
char i = 0;
/* for(i=0;i<n;i++)
{
_nop_();
}
} */
void clock_initial() reentrant using 0
{
TMOD=0x01;
TF0=0;
TR0=0;
TH0=0xf8;
TL0=0x30;
TR0=1;
ET0=1;
EA=1;
}
void clock_int() interrupt 1 using 1
{
if(--msec==0)
{
gUsbTimeOver=1;
//ET0=0;
//EA=0;
}
}
void RISC_start_timer2(U32 n)
{
msec=n;
clock_initial();
}
int usb_irq_poll()
{
return (IO_IRQ_PENDING);
}
int usb_plugin()
{
return (IO_PLUGIN_DET);
}
void RISC_sleep_nsec(U32 n)
{
U32 nusec=n/1000;
U32 i;
for(i=0;i<nusec;i++)
{
_nop_();
_nop_();
}
}
void RISC_sleep_cycles(int n)
{
while(n--)
{
_nop_();
}
}
void DEV_TimerStart(int msec)
{
gUsbTimeOver=0;
RISC_start_timer2(msec);
}
/******************************************************************************
* MemCopy
******************************************************************************/
/*
void MemCopy(U8* pTrg, U8* pSrc, U16 bytCnt)
{
while(bytCnt-->0) *pTrg++ = *pSrc++;
return;
}
*/
/******************************************************************************
* MemFill
******************************************************************************/
void MemFill(U8* buf, U8 val, U16 bytCnt)
{
while(bytCnt-->0) *buf++ = val;
return;
}
/*
void DEV_WriteReg(U8 addr, U8 regdata)
{
MCU_CS=1;
MCU_A0=1;
MCU_WR=1;
P0=addr;
MCU_A0=0;
MCU_CS=0;
MCU_WR=0;
_nop_();
_nop_();
_nop_();
MCU_WR=1;
MCU_CS=1;
MCU_A0=1;
_nop_();
_nop_();
_nop_();
P0=regdata;
MCU_CS=0;
MCU_WR=0;
_nop_();
_nop_();
_nop_();
MCU_WR=1;
MCU_CS=1;
}
U8 DEV_ReadReg(U8 addr)
{
register U8 regdata;
MCU_RD=1;
MCU_A0=1;
MCU_CS=1;
MCU_WR=1;
P0=addr;
MCU_A0=0;
MCU_CS=0;
MCU_WR=0;
_nop_();
_nop_();
_nop_();
MCU_WR=1;
MCU_A0=1;
MCU_CS=1;
_nop_();
_nop_();
_nop_();
P0=0xFF; /////
MCU_CS=0;
MCU_RD=0;
regdata=P0;
MCU_RD=1;
MCU_CS=1;
return regdata;
}
*/
void DEV_WriteReg(U8 addr, U8 regdata)
{
MCU_CS=1;
MCU_A0=1;
MCU_WR=1;
P0=addr;
MCU_A0=0;
MCU_CS=0;
MCU_WR=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
MCU_WR=1;
_nop_();
MCU_CS=1;
_nop_();
_nop_();
MCU_A0=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P0=regdata;
_nop_();
_nop_();
MCU_CS=0;
MCU_WR=0;
_nop_();
_nop_();
_nop_();
MCU_WR=1;
_nop_();
MCU_CS=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
U8 DEV_ReadReg(U8 addr)
{
register U8 regdata;
MCU_RD=1;
MCU_A0=1;
MCU_CS=1;
MCU_WR=1;
P0=addr;
MCU_A0=0;
MCU_CS=0;
MCU_WR=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
MCU_WR=1;
_nop_();
MCU_A0=1;
MCU_CS=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P0=0xFF; /////
_nop_();
MCU_CS=0;
MCU_RD=0;
_nop_();
_nop_();
_nop_();
regdata=P0;
_nop_();
_nop_();
_nop_();
MCU_RD=1;
_nop_();
MCU_CS=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
return regdata;
}
void DEV_WriteRegMulti(U8 addr, U16 cnt, U8* buf)
{
U16 i;
U8 *dptr;
dptr=buf;
if(cnt<512)
{
for(i=0;i<cnt;i++)
{
DEV_WriteReg(addr,*dptr++);
}
}
else
{
for(i=0;i<cnt;i++)
{
DEV_WriteReg(addr,i);
if((i%0x40) ==0)
RISC_sleep_cycles(100);
}
}
}
U8 DEV_ReadRegMulti(U8 addr, U16 cnt, register U8* buf)
{
U16 i;
register U8 regdata;
if(cnt<64)
{
if(buf!=TxNULL){
for(i=0x0;i<cnt;i++) {
*buf++ =DEV_ReadReg(addr);
}
}
else{
for(i=0x0;i<cnt;i++) {
regdata =DEV_ReadReg(addr);
}
}
return regdata;
}
else
{
if(buf!=TxNULL){
for(i=0x0;i<cnt;i++) {
*buf =DEV_ReadReg(addr);
}
}
else{
for(i=0x0;i<cnt;i++) {
regdata =DEV_ReadReg(addr);
}
}
}
}
/******************************************************************************
* check if device is connected
******************************************************************************/
U8 DEV_CheckDeviceConnection(void)
{
register U8 devAddr;
if(!UH_DEV_IS_PLUGGEDIN()) return RES_ERR;
devAddr = DEV_ReadReg(RH_DEV_ADDR);
if(devAddr==0){
DEV_WriteReg(RH_MASS_ADDR1,0x5A);
if(DEV_ReadReg(RH_MASS_ADDR1)!=0x5A) return RES_ERR;
DEV_WriteReg(RH_MASS_ADDR1,0);
return RES_OK;
}
return (gDevAddr==devAddr)?RES_OK:RES_ERR;
}
/******************************************************************************
* Wait (?)MSec
*
* INPUT: - msec: mili-sec intervals to measure
* RETURN:
* RES_OK
* RES_ERR
* NOTE:
* before this routine .. SOF must be enabled: "DEV_WriteReg(RH_CHIP_CTR2,0x10);"
* this timer may has maximum 1msec deviation !!!
******************************************************************************/
U8 DEV_WaitMS(U16 msec)
{
U16 ms, res=RES_OK;
if(!UH_DEV_IS_PLUGGEDIN()) {return RES_ERR;}
DEV_WriteReg(RH_INT_EN,UH_IRQ_SOF);
DEV_ReadReg(0x08);
DEV_TimerStart(2);
for(ms=0;ms<msec&&gUsbTimeOver==0; )
{
if(UBi9021_IRQ_PENDING()){
if((DEV_ReadReg(RH_INT_STS)&UH_IRQ_SOF)>0){
DEV_TimerStart(2);
ms++;
}
//printf("IRQ PENDING....................................\n");
}
//printf("IRQ PENDING:%02x\n",UBi9021_IRQ_PENDING());
if(UBi9021_IRQ_PENDING()==0)
if(ISERR(DEV_CheckDeviceConnection())){res=RES_ERR; break; }
RISC_sleep_nsec(WFIRQ_SLEEP_TIME);
}
DEV_WriteReg(RH_INT_EN,0);
return res;
}
/******************************************************************************
* DSESCRIPION:
* wait for UBi9021 Host interrupt.
* If time-out occurs, reset UBi9021 chip.
*
* INPUT:
* - bIRQ: anticipated IRQ bits (OR-ing)
*
* RETURN:
* - interrupt status: if enabled interrupt status occurs.
* - 0: if time-out
* - 4: if stall.
*
* EXAMPLE:
* UH_IRQ_EN(UH_IRQ_USB_PKT_DONE);
* UH_Trigger(gEPIN);
* if(DEV_WaitForIrq(UH_IRQ_USB_PKT_DONE)==0) return RES_ERR;
*
******************************************************************************/
U8 DEV_WaitForIrq(U8 bIRQ)
{
U32 ticks=0;
DEV_TimerStart(gWaitUsbPktMsec);
while(gUsbTimeOver==0)
{
gUsbIrq = 0;
if(UBi9021_IRQ_PENDING())
{
GET_UBi9021_IRQ_STS(gUsbIrq);
if( (!(0x80&gEP)||(0xD0==gEP)) &&
(DEV_ReadReg(RH_LAST_PKT_STS)&UH_LST_PKT_STS_NAK) ){
DEV_WriteReg(RH_EP_ADDR_N_PID,gEP);
// printf(("DEV_WaitForIrq: NAK -> retry\n"));
continue;
}
if(gUsbIrq&bIRQ){
DEV_WriteReg(RH_INT_EN,0);
return gUsbIrq;
}
}
if((0xD0!=gEP) && DEV_ReadReg(RH_LAST_PKT_STS)==UH_LST_PKT_STS_STALL){
USB_ResetPipe(gEP&~0x10);
//printf(("DEV_WaitForIrq: stalled\n"));
return UH_IRQ_FAKE_STALL;//STALL mark
}
if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)){
//printf(("DEV_WaitForIrq: addr error %x\n",DEV_ReadReg(RH_DEV_ADDR)));
break;
}
}
//printf(("DEV_WaitForIrq: timeout error, gSecCnt=%x\n",gSecCnt));
DEV_ResetChip(RST9021_FULL_RESET);
return 0;
}
U8 DEV_WaitForIrqV(U8 bIRQ) //for video playing
{
U8 pktSts=0;
DEV_TimerStart(gWaitUsbPktMsec);
while(gUsbTimeOver==0)
{
if(UBi9021_IRQ_PENDING())
{
GET_UBi9021_IRQ_STS(gUsbIrq);
if((!(0x80&gEP)||(0xD0==gEP)) &&
(DEV_ReadReg(RH_LAST_PKT_STS)&UH_LST_PKT_STS_NAK) ){
DEV_WriteReg(RH_EP_ADDR_N_PID,gEP);
//printf(("DEV_WaitForIrqV: NAK -> retry\n"));
continue;
}
if(gUsbIrq&bIRQ){
DEV_WriteReg(RH_INT_EN,0);
return gUsbIrq;
}
}
if((0xD0!=gEP) && DEV_ReadReg(RH_LAST_PKT_STS)==UH_LST_PKT_STS_STALL){
USB_ResetPipe(gEP&~0x10);
//printf(("DEV_WaitForIrqV: stalled\n"));
return UH_IRQ_FAKE_STALL;//STALL mark
}
if(gDevAddr!=DEV_ReadReg(RH_DEV_ADDR)||0x5A!=DEV_ReadReg(RH_MASS_ADDR2)){
//printf(("DEV_WaitForIrqV: addr error %x\n",DEV_ReadReg(RH_DEV_ADDR)));
break;
}
}
//printf(("DEV_WaitForIrqV: timeout error, gSecCnt=%x\n",gSecCnt));
DEV_ResetChip(RST9021_FULL_RESET);
return 0;
}
void ubi9021_hardreset()
{
gInitState=IS_NO_INIT;
//IO_BUS_RESET_READY;
IO_BUS_RESET_HIGH;//PW_RST_PORT_LOW;
RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
IO_BUS_RESET_LOW;//PW_RST_PORT_LOW;
RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
IO_BUS_RESET_HIGH;//PW_RST_PORT_LOW;
RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
IO_BUS_RESET_LOW;//PW_RST_PORT_LOW;
RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
IO_BUS_RESET_HIGH;//PW_RST_PORT_LOW;
MCU_SEL_OUT =0x01;
RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
DEV_WriteReg(RH_CHIP_CTR2,0x20);
//RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
UH_ENFORCE_HOST_MODE();
UH_ENFORCE_HOST_MODE();
//RISC_sleep_cycles(UMO_RESET_IDLE_TICKS);
DEV_WriteReg(RH_CHIP_CTR2,0x10);
}
/******************************************************************************
* reset UBi9021 chip (not USB device reset)
*
* RETURN:
* RES_OK
* RES_ERR+1: device removed
******************************************************************************/
U8 DEV_ResetChip(U8 mode)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -