📄 main.lss
字号:
// Led init
// First, enable the clock of the PIOB
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
//* to be outputs. No need to set these pins to be driven by the PIO because it is GPIO pins only.
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, AT91B_LED_MASK ) ;
//* Clear the LED's.
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, AT91B_LED_MASK ) ;
//* Set led 1e LED's.
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, AT91B_LED1 ) ;
// Init USB device
AT91F_USB_Open();
100242: f7ff ffcb bl 1001dc <AT91F_USB_Open>
100246: 4c28 ldr r4, [pc, #160] (1002e8 <.text+0x2e8>)
// Init USB device
// Wait for the end of enumeration
while (!pCDC.IsConfigured(&pCDC));
100248: 68e3 ldr r3, [r4, #12]
10024a: 1c20 adds r0, r4, #0
10024c: f000 f84e bl 1002ec <.text+0x2ec>
100250: 2800 cmp r0, #0
100252: d0f9 beq.n 100248 <main+0x28>
__inline void AT91F_PIO_ClearOutput(
AT91PS_PIO pPio, // \arg pointer to a PIO controller
unsigned int flag) // \arg output to be cleared
{
pPio->PIO_CODR = flag;
100254: 4c23 ldr r4, [pc, #140] (1002e4 <.text+0x2e4>)
100256: 2301 movs r3, #1
100258: 6363 str r3, [r4, #52]
//* Set led 1e LED's.
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, AT91B_LED1 ) ;
// Set Usart in interrupt
Usart_init();
10025a: f000 fba5 bl 1009a8 <Usart_init>
__inline void AT91F_PIO_ClearOutput(
AT91PS_PIO pPio, // \arg pointer to a PIO controller
unsigned int flag) // \arg output to be cleared
{
pPio->PIO_CODR = flag;
10025e: 230f movs r3, #15
100260: 6363 str r3, [r4, #52]
100262: 2700 movs r7, #0
100264: 4d20 ldr r5, [pc, #128] (1002e8 <.text+0x2e8>)
100266: 466c mov r4, sp
//* Set led all LED's.
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, AT91B_LED_MASK ) ;
mLen = 0;
while (1)
{ // Loop
length = pCDC.Read(&pCDC, data, MSG_SIZE);
100268: 696b ldr r3, [r5, #20]
10026a: 1c28 adds r0, r5, #0
10026c: 4669 mov r1, sp
10026e: 2264 movs r2, #100
100270: f000 f83c bl 1002ec <.text+0x2ec>
100274: 1c06 adds r6, r0, #0
data[length]=0;
100276: 2300 movs r3, #0
100278: 5423 strb r3, [r4, r0]
//while((*AT91C_SPI_SR&AT91C_SPI_TXEMPTY)==0); // 等待数据传送完毕
//*AT91C_SPI_TDR = data[0]; // 传送数据到SPI寄存器
//if((data[0]== 'y') || (data[0]== 'M'))
// Trace_Toggel_LED( AT91B_LED1) ;
AT91F_US_Put(data);
10027a: 4668 mov r0, sp
10027c: f000 fb7a bl 100974 <AT91F_US_Put>
if(data[0] == 'z')
100280: 7823 ldrb r3, [r4, #0]
100282: 2b7a cmp r3, #122
100284: d102 bne.n 10028c <main+0x6c>
100286: 2201 movs r2, #1
100288: 4690 mov r8, r2
10028a: e017 b.n 1002bc <main+0x9c>
mTmpLen = 1;
if((mTmpLen == 1)&& (data[0]== 'r'))
10028c: 4642 mov r2, r8
10028e: 2a01 cmp r2, #1
100290: d104 bne.n 10029c <main+0x7c>
100292: 2b72 cmp r3, #114
100294: d112 bne.n 1002bc <main+0x9c>
100296: 2302 movs r3, #2
100298: 4698 mov r8, r3
10029a: e00f b.n 1002bc <main+0x9c>
mTmpLen = 2;
if((mTmpLen == 2)&& (data[0]== 'e'))
10029c: 4642 mov r2, r8
10029e: 2a02 cmp r2, #2
1002a0: d104 bne.n 1002ac <main+0x8c>
1002a2: 2b65 cmp r3, #101
1002a4: d10a bne.n 1002bc <main+0x9c>
1002a6: 2303 movs r3, #3
1002a8: 4698 mov r8, r3
1002aa: e007 b.n 1002bc <main+0x9c>
mTmpLen = 3;
if((mTmpLen == 3)&& (data[0]== 'o'))
1002ac: 4642 mov r2, r8
1002ae: 2a03 cmp r2, #3
1002b0: d104 bne.n 1002bc <main+0x9c>
1002b2: 2b6f cmp r3, #111
1002b4: d102 bne.n 1002bc <main+0x9c>
1002b6: 2700 movs r7, #0
1002b8: 46b8 mov r8, r7
1002ba: e000 b.n 1002be <main+0x9e>
{mLen = 0;mTmpLen = 0;}
else
mLen+=length;
1002bc: 19bf adds r7, r7, r6
data[0]= mLen >> 16;
1002be: 0c3b lsrs r3, r7, #16
1002c0: 7023 strb r3, [r4, #0]
data[1]= (mLen >> 8)& 0xff;
1002c2: 0a3b lsrs r3, r7, #8
1002c4: 7063 strb r3, [r4, #1]
data[2]= mLen & 0xff;
1002c6: 70a7 strb r7, [r4, #2]
pCDC.Write(&pCDC,data,3);
1002c8: 692b ldr r3, [r5, #16]
1002ca: 1c28 adds r0, r5, #0
1002cc: 4669 mov r1, sp
1002ce: 2203 movs r2, #3
1002d0: f000 f80c bl 1002ec <.text+0x2ec>
1002d4: e7c8 b.n 100268 <main+0x48>
1002d6: 0000 lsls r0, r0, #0
1002d8: 0401 lsls r1, r0, #16
1002da: a500 add r5, pc, #0 (adr r5,1002dc <.text+0x2dc>)
1002dc: fd00 ffff stc2 15, cr15, [r0, #-1020]
1002e0: fc00 ffff stc2 15, cr15, [r0], {255}
1002e4: f400 ffff bl ffd012e6 <__TOP_STACK+0xffaf12e6>
1002e8: 029c lsls r4, r3, #10
1002ea: 0020 lsls r0, r4, #0
1002ec: 4718 bx r3
1002ee: 46c0 nop (mov r8, r8)
001002f0 <AT91F_CDC_Open>:
//* \brief
//*----------------------------------------------------------------------------
AT91PS_CDC AT91F_CDC_Open(AT91PS_CDC pCdc, AT91PS_UDP pUdp)
{
pCdc->pUdp = pUdp;
1002f0: 6001 str r1, [r0, #0]
pCdc->currentConfiguration = 0;
1002f2: 2300 movs r3, #0
1002f4: 7103 strb r3, [r0, #4]
pCdc->currentConnection = 0;
1002f6: 7143 strb r3, [r0, #5]
pCdc->currentRcvBank = AT91C_UDP_RX_DATA_BK0;
1002f8: 2302 movs r3, #2
1002fa: 6083 str r3, [r0, #8]
pCdc->IsConfigured = AT91F_UDP_IsConfigured;
1002fc: 4b03 ldr r3, [pc, #12] (10030c <.text+0x30c>)
1002fe: 60c3 str r3, [r0, #12]
pCdc->Write = AT91F_UDP_Write;
100300: 4b03 ldr r3, [pc, #12] (100310 <.text+0x310>)
100302: 6103 str r3, [r0, #16]
pCdc->Read = AT91F_UDP_Read;
100304: 4b03 ldr r3, [pc, #12] (100314 <.text+0x314>)
100306: 6143 str r3, [r0, #20]
return pCdc;
}
100308: 4770 bx lr
10030a: 0000 lsls r0, r0, #0
10030c: 03d5 lsls r5, r2, #15
10030e: 0010 lsls r0, r2, #0
100310: 0729 lsls r1, r5, #28
100312: 0010 lsls r0, r2, #0
100314: 07cd lsls r5, r1, #31
100316: 0010 lsls r0, r2, #0
00100318 <AT91F_USB_SendData>:
//*----------------------------------------------------------------------------
//* \fn AT91F_UDP_IsConfigured
//* \brief Test if the device is configured and handle enumeration
//*----------------------------------------------------------------------------
static uchar AT91F_UDP_IsConfigured(AT91PS_CDC pCdc)
{
AT91PS_UDP pUDP = pCdc->pUdp;
AT91_REG isr = pUDP->UDP_ISR;
if (isr & AT91C_UDP_ENDBUSRES) {
pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
// reset all endpoints
pUDP->UDP_RSTEP = (unsigned int)-1;
pUDP->UDP_RSTEP = 0;
// Enable the function
pUDP->UDP_FADDR = AT91C_UDP_FEN;
// Configure endpoint 0
pUDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL);
}
else if (isr & AT91C_UDP_EPINT0) {
pUDP->UDP_ICR = AT91C_UDP_EPINT0;
AT91F_CDC_Enumerate(pCdc);
}
return pCdc->currentConfiguration;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_UDP_Read
//* \brief Read available data from Endpoint OUT
//*----------------------------------------------------------------------------
static uint AT91F_UDP_Read(AT91PS_CDC pCdc, char *pData, uint length)
{
AT91PS_UDP pUdp = pCdc->pUdp;
uint packetSize, nbBytesRcv = 0, currentReceiveBank = pCdc->currentRcvBank;
while (length) {
if ( !AT91F_UDP_IsConfigured(pCdc) )
break;
if ( pUdp->UDP_CSR[AT91C_EP_OUT] & currentReceiveBank ) {
packetSize = MIN(pUdp->UDP_CSR[AT91C_EP_OUT] >> 16, length);
length -= packetSize;
if (packetSize < AT91C_EP_OUT_SIZE)
length = 0;
while(packetSize--)
pData[nbBytesRcv++] = pUdp->UDP_FDR[AT91C_EP_OUT];
pUdp->UDP_CSR[AT91C_EP_OUT] &= ~(currentReceiveBank);
if (currentReceiveBank == AT91C_UDP_RX_DATA_BK0)
currentReceiveBank = AT91C_UDP_RX_DATA_BK1;
else
currentReceiveBank = AT91C_UDP_RX_DATA_BK0;
}
}
pCdc->currentRcvBank = currentReceiveBank;
return nbBytesRcv;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_CDC_Write
//* \brief Send through endpoint 2
//*----------------------------------------------------------------------------
static uint AT91F_UDP_Write(AT91PS_CDC pCdc, const char *pData, uint length)
{
AT91PS_UDP pUdp = pCdc->pUdp;
uint cpt = 0;
// Send the first packet
cpt = MIN(length, AT91C_EP_IN_SIZE);
length -= cpt;
while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
while (length) {
// Fill the second bank
cpt = MIN(length, AT91C_EP_IN_SIZE);
length -= cpt;
while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
// Wait for the the first bank to be sent
while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) )
if ( !AT91F_UDP_IsConfigured(pCdc) ) return length;
pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);
pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
}
// Wait for the end of transfer
while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) )
if ( !AT91F_UDP_IsConfigured(pCdc) ) return length;
pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);
return length;
}
//*----------------------------------------------------------------------------
//* \fn AT91F_USB_SendData
//* \brief Send Data through the control endpoint
//*----------------------------------------------------------------------------
unsigned int csrTab[100];
unsigned char csrIdx = 0;
static void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, uint length)
{
100318: b570 push {r4, r5, r6, lr}
10031a: b081 sub sp, #4
10031c: 1c0e adds r6, r1, #0
10031e: 1c15 adds r5, r2, #0
uint cpt = 0;
AT91_REG csr;
do {
cpt = MIN(length, 8);
100320: 1c2c adds r4, r5, #0
100322: 2d08 cmp r5, #8
100324: d900 bls.n 100328 <AT91F_USB_SendData+0x10>
100326: 2408 movs r4, #8
length -= cpt;
while (cpt--)
100328: 1e61 subs r1, r4, #1
10032a: d306 bcc.n 10033a <AT91F_USB_SendData+0x22>
10032c: 1c32 adds r2, r6, #0
pUdp->UDP_FDR[0] = *pData++;
10032e: 7813 ldrb r3, [r2, #0]
100330: 6503 str r3, [r0, #80]
100332: 3201 adds r2, #1
100334: 3901 subs r1, #1
100336: d2fa bcs.n 10032e <AT91F_USB_SendData+0x16>
100338: 1936 adds r6, r6, r4
if (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) {
10033a: 6b03 ldr r3, [r0, #48]
10033c: 2201 movs r2, #1
10033e: 4213 tst r3, r2
100340: d005 beq.n 10034e <AT91F_USB_SendData+0x36>
pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP);
100342: 6b03 ldr r3, [r0, #48]
100344: 4393 bics r3, r2
100346: 6303 str r3, [r0, #48]
while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP);
100348: 6b03 ldr r3, [r0, #48]
10034a: 4213 tst r3, r2
10034c: d1fc bne.n 100348 <AT91F_USB_SendData+0x30>
}
pUdp->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY;
10034e: 6b03 ldr r3, [r0, #48]
100350: 2210 movs r2, #16
100352: 4313 orrs r3, r2
100354: 6303 str r3, [r0, #48]
100356: 2102 movs r1, #2
do {
csr = pUdp->UDP_CSR[0];
100358: 6b03 ldr r3, [r0, #48]
10035a: 9300 str r3, [sp, #0]
// Data IN stage has been stopped by a status OUT
if (csr & AT91C_UDP_RX_DATA_BK0) {
10035c: 9b00 ldr r3, [sp, #0]
10035e: 420b tst r3, r1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -