📄 main.c
字号:
}
#define INPUT_BITS 11
#define OUTPUT_BITS 5
#define ADDR_LEN 7
#define ENDP_LEN 4
//-------------------------------- end reverse8-----------------------------
// return 11-bit concatenation of 7-bit address and 4-bit endpoint
// assume 7-bit address, 4-bit endpoint
UHWORD addr_endp_cat(UBYTE addr, UBYTE endp)
{
return((UHWORD)((reverse8(addr, ADDR_LEN) << 4) | reverse8(endp, ENDP_LEN)));
}
//-------------------------------- end addr_endp_cat------------------------
// crc5 -- return 5-bit crc5
// CRC5 Generating Polynomial: x**5 + x**2 + 1
// ADDR Input: 7-bits LSB..MSB
// ENDP Input: 4-bits LSB..MSB
// Input to crc5 is concatenation: <ADDR Input><ENDP Input>
// Output is 5-bit CRC5: LSB..MSB
UBYTE crc5(UHWORD data)
{
UHWORD gen_poly = 0x5; // Generating Polynomial
UBYTE the_crc5; // the_crc5
int bit_pos_d;
int bit_pos_c;
UBYTE d_bit;
UBYTE c_bit;
gen_poly = 0x5; // Generating Polynomial
the_crc5 = (1<<OUTPUT_BITS)-1; // the_crc5
bit_pos_d = INPUT_BITS-1;
bit_pos_c = OUTPUT_BITS-1;
while( bit_pos_d >= 0 )
{
d_bit = (((1<<bit_pos_d) & data) != 0);
c_bit = (((1<<bit_pos_c) & the_crc5) != 0);
data ^= d_bit << bit_pos_d; // clear bit
the_crc5 ^= c_bit << bit_pos_c; // clear bit
bit_pos_d--;
the_crc5 <<= 1;
if(d_bit != c_bit) the_crc5 ^= gen_poly;
}
the_crc5 ^= (1<<OUTPUT_BITS)-1;
return the_crc5;
}
//-------------------------------- end crc5-----------------------------
void send_token(UBYTE token, UBYTE addr, UBYTE end_p)
{
UHWORD y;
UBYTE c_sum,by1,by2;
y=addr_endp_cat(addr,end_p);
c_sum=crc5(y);
by1=reverse8(addr,8);
by2=reverse8(end_p,8);
if (by2 & 0x80) by1 |=1;
by2 <<=1;
by2 |=c_sum;
ep0_out[0][0]=reverse8(token,8);
ep0_out[0][1]=reverse8(by1,8);
ep0_out[0][2]=reverse8(by2,8);
switch(token)
{
case IN_TOKEN:
ep0_rxbd[0]->status = HW0+ HW2+HW3 ;
ep0_txbd[0]->status = HW0+HW2+HW3+HW4+HW6 ;
ep0_txbd[0]->length=3;
fl_txb=0; fl_rxb=0;
while(!(*ussft>max_sof_del)) {}
reg_usb->uscom=0x80; // start EP0
while(! fl_txb) {}
if (reg_usb->usber & HW11)
{
if (ep0_txbd[0]->status & 4) flush_restart_ep(0);
}
else while(! fl_rxb) {}
break;
case OUT_TOKEN:
ep0_txbd[0]->length=3;
ep0_txbd[0]->pointer = (UWORD )&ep0_out[0][0];
ep0_txbd[0]->status = HW0+HW3+HW4;
ep0_txbd[1]->length=20;
ep0_txbd[1]->pointer = (UWORD )&ep0_out[0][1];
ep0_txbd[1]->status = HW0+ HW2 +HW3+HW4 +HW5 +HW6 +HW8+HW9; // DATA1 PID must be; L, TC, CNF must be,
fl_txb=0;
while(!(*ussft>max_sof_del)) {}
f_rxbd[1]->length = 0 ;
f_rxbd[1]->pointer = (UWORD)&(fep_in[1][0]);
f_rxbd[1]->status = HW0 | HW2 ;
reg_usb->uscom=0x80; // start EP0
while(! fl_txb) {}
if (reg_usb->usber & HW11)
{
if (ep0_txbd[0]->status & 4) flush_restart_ep(0);
if (ep0_txbd[1]->status & 4) flush_restart_ep(0);
}
break;
case SETUP_TOKEN:
ep0_txbd[0]->status = HW0+HW4;
ep0_txbd[0]->length=3;
ep0_txbd[1]->status = HW0+ HW2 +HW3+HW4 +HW5 +HW6 +HW8+HW9; // DATA1 PID must be; L, TC, CNF must be,
ep0_txbd[1]->length=10;
ep0_out[1][0]=0x80;
ep0_out[1][1]=0;
ep0_out[1][2]=0; ep0_out[1][3]=0;
ep0_out[1][4]=0; ep0_out[1][5]=0;
ep0_out[1][6]=0; ep0_out[1][7]=2;
reg_usb->uscom=0x80; // start EP0
fl_txb=0;
while(!(*ussft>max_sof_del)) {}
reg_usb->uscom=0x80; // start EP0
while(! fl_txb) {}
if (reg_usb->usber & HW11)
{
if (ep0_txbd[0]->status & 4) flush_restart_ep(0);
if (ep0_txbd[1]->status & 4) flush_restart_ep(0);
}
break;
}
}
//-------------------------------- end send_token-----------------------------
void test_usb_pins(void)
{
immr->io_regs[PortD].ppar &=~W23;
immr->io_regs[PortD].pdir |= W23; // USBTxP to PD23; P1_A9
immr->io_regs[PortD].ppar &=~W24;
immr->io_regs[PortD].pdir |= W24; // USBTxN to PD24; P1_A8
csr->bcsr3 &=~(W0 |W1); // USB enabled; high speed
immr->io_regs[PortD].pdat &=~W23;
immr->io_regs[PortD].pdat |= W23;
while(1)
{
immr->io_regs[PortD].pdat |= W24;
immr->io_regs[PortD].pdat &=~W24;
}
}
//-----------------end test_usb_pins-----------------------------------
void enable_ex_irq(void)
{
register unsigned long gpr;
asm( mfmsr gpr );
gpr |=W16;
asm( mtmsr gpr );
}
//--------------------------------end init_ex_irq--------------------------------
void usb_interrupt_init(void)
{
immr->ic_sipnr_l &=~W26; // clear pend from CPM USB
immr->ic_simr_l |= W26; // unmasked CPM USB
enable_ex_irq(); // set bits EE and RI in MSR
reg_usb->usmer = HW12 | HW14 | HW15;
}
//-------------------------------- end usb_interrupt_init-----------------------------
void InterruptInit(UWORD *interrupt_vector, UWORD interrupt_code[])
{
UHWORD index;
UWORD *instruction;
UWORD *next_vector;
next_vector=interrupt_vector;
next_vector = (interrupt_vector + VECTOR_BLOCK_LEN); /* next vector entry */
index = 0;
for(instruction = interrupt_vector; instruction < next_vector; instruction++)
{
*instruction = interrupt_code[index];
index++;
}
}
//--------------------------------end InterruptInit--------------------------------
void InterruptHandler(void)
{
}
//--------------------------------end InterruptHandler--------------------------------------
void DecIntHandler(void)
{
register unsigned long gpr;
gpr=10000000;
asm
{
mtspr SPR_DEC, gpr
}
}
//----------------------end DecIntHandler------------------------
void ExtIntHandler(void)
{
UWORD sl_sivec;
UHWORD sh1;
UHWORD sl_usber;
sl_sivec =immr->ic_sivec; // sivec interrupt code
switch(sl_sivec)
{
case 0x2C000000: // This IRQ is the request from USB_8272
{
sl_usber=reg_usb->usber;
if (sl_usber & HW12) // SOF
{
sl_frame_n++;
sl_frame_n &=0x7ff;
sh1=(UHWORD)crc5(sl_frame_n);
sh1 <<=11;
sh1 |=sl_frame_n;
pram_usb->frame_n=sh1;
fl_sof=1;
reg_usb->usber =HW12; // clear SOF pending bit
}
if (sl_usber & (HW14 | HW11)) // TxB
{
reg_usb->usber =HW14; // clear TxB pending bit
fl_txb=1;
}
if (sl_usber & HW15) // RxB
{
reg_usb->usber =HW15; // clear TxB pending bit
fl_rxb=1;
}
}
break;
}
}
//-------------------------------- end ExtIntHandler --------------------------------
UHWORD sofgen (UHWORD frame) //Generates SOF frame & CRC5
{
return (UHWORD)((frame & 0x07ff) | (UHWORD)(crc5(frame) << 11));
}
//------------------end sofgen--------------------------------------------
// ussft is incremented up to 11999 (1us)
//------------------MAIN---------------------------------------------------------
void main()
{
init_addr();
InterruptInit((UWORD *) EXT_INT_VECTOR, Ex500); // Place External Interrupt Handler Code to Address 0x500
InterruptInit((UWORD *) DEC_INT_VECTOR, Ex900); // Place Decrementer Interrupt Handler Code to Address 0x900
max_sof_del=8000;
//test_usb_pins();
csr->bcsr3 |= W0; // USB is disabled
csr->bcsr3 &=~W2; // USB power is disabled
csr->bcsr3 |=W3;
csr->bcsr1 |=W2 + W4;
init_usb_host();
csr->bcsr3 &=~(W0 |W1); // USB enabled; high speed
pram_usb->frame_n=sofgen(0);
enable_sof_generation();
usb_interrupt_init();
fl_sof=0; fl_txb=0; fl_rxb=0;
while(1)
{
send_token(OUT_TOKEN,5,1);
// setup_token();
// in_token();
if (fl_sof)
{
// csr->bcsr4 ^=W3;
fl_sof=0;
}
sl1=reg_usb->usber;
sl1=immr->ic_sipnr_l;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -