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

📄 main.lss

📁 高性能USB转串口(可高达10Mbps)完整的源代码
💻 LSS
📖 第 1 页 / 共 5 页
字号:
   // 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 + -