diff options
Diffstat (limited to 'openpicc/os')
| -rw-r--r-- | openpicc/os/boot/boot.s | 150 | ||||
| -rw-r--r-- | openpicc/os/usb/USB-CDC.c | 13 | ||||
| -rw-r--r-- | openpicc/os/usb/USB-CDC.h | 1 | 
3 files changed, 53 insertions, 111 deletions
| diff --git a/openpicc/os/boot/boot.s b/openpicc/os/boot/boot.s index d9ac156..4fca262 100644 --- a/openpicc/os/boot/boot.s +++ b/openpicc/os/boot/boot.s @@ -4,9 +4,7 @@  	.extern exit  	.extern AT91F_LowLevelInit  	.extern pio_irq_isr_value -	.extern ssc_tx_pending -	.extern ssc_tx_fiq_fdt_cdiv -	.extern ssc_tx_fiq_fdt_ssc +	.extern tc_sniffer_next_buffer_for_fiq  	.text  	.code 32 @@ -47,15 +45,14 @@  .equ AT91C_BASE_MC,   (0xFFFFFF00)  .equ AT91C_BASE_PIOA, 0xFFFFF400  .equ AT91C_BASE_TC0,  0xFFFA0000 +.equ AT91C_BASE_TC2,  0xFFFA0080  .equ AT91C_BASE_SSC,  0xFFFD4000  .equ SSC_CR,          0x0  .equ SSC_RCMR,        0x10  .equ SSC_CR_TXEN,     0x100  .equ AT91C_TC_SWTRG,  ((1 << 2)|1)  .equ AT91C_TC_CLKEN,  (1 << 0) -.equ PIO_DATA,        (1 << 27) -.equ PIO_FRAME,       (1 << 20) -.equ PIO_SSC_TF,      (1 << 15) +.equ PIO_DATA,        (1 << 18)  .equ PIOA_SODR,       0x30  .equ PIOA_CODR,       0x34  .equ PIOA_PDSR,       0x3c @@ -71,6 +68,8 @@  .equ PIO_SECONDARY_IRQ, 31  .equ PIO_SECONDARY_IRQ_BIT, (1 << PIO_SECONDARY_IRQ) +.equ BUFSIZE, 1024 +  start:  _start:  _mainCRTStartup: @@ -90,7 +89,6 @@ _mainCRTStartup:      ldr     r10, =AT91C_BASE_PIOA      ldr     r12, =AT91C_BASE_TC0      ldr     r8, =AT91C_BASE_AIC -    mov     r9, #AT91C_TC_SWTRG      /*ldr     r9, =AT91C_BASE_SSC*/      mov   sp, r0      sub   r0, r0, #FIQ_STACK_SIZE @@ -196,7 +194,7 @@ endless_loop:  my_fiq_handler:                  /* code that uses pre-initialized FIQ reg */                  /* r8   tmp -                   r9   AT91C_TC_SWTRG +                   r9   tmp                     r10  AT91C_BASE_PIOA                     r11  tmp                     r12  AT91C_BASE_TC0 @@ -215,111 +213,47 @@ my_fiq_handler:                  str   r8, [r11]                  tst     r8, #PIO_DATA           /* check for PIO_DATA change */ -                ldrne   r11, [r10, #PIOA_PDSR] -                tstne   r11, #PIO_DATA          /* check for PIO_DATA == 1 */ -                /*strne   r9, [r12, #TC_CCR]      /* software trigger */ - -                movne   r11, #PIO_DATA -                strne   r11, [r10, #PIOA_IDR]   /* disable further PIO_DATA FIQ */ -                beq .no_pio_data -/* .loop_high: -				ldr     r11, [r10, #PIOA_PDSR] -				tst     r11, #PIO_DATA -				bne     .loop_high -                str   r9, [r12, #TC_CCR]      /* software trigger */ - -.no_pio_data: -                tst     r8, #PIO_SSC_TF         /* check for SSC Transmit Frame signal */ -                ldrne   r11, [r10, #PIOA_PDSR] -                tstne   r11, #PIO_SSC_TF        /* check for SSC_TF == 1 */ -                 -                movne   r11, #PIO_SSC_TF -                strne   r11, [r10, #PIOA_IDR]   /* disable further SSC_TF FIQ */ -                 -                ldrne   r11, =ssc_tx_pending -                ldrne   r8, [r11] -                tstne   r8, #0x01              /* Check whether a TX is pending */ -                beq     .no_ssc -                b .no_ssc +                beq     .no_buffer -                mov   r8, #PIO_LED1 -                str   r8, [r10, #PIOA_SODR] /* disable LED */ +                ldr   r11, [r10, #PIOA_PDSR] +                tst   r11, #PIO_DATA          /* check for PIO_DATA == 1 */ +                beq   .no_buffer + +/*                mov     r11, #PIO_LED2 +                str     r11, [r10, #PIOA_CODR] /* enable LED */ + +                /* Load the TC2.CV into r9 */ +                ldr r9, [r12, #TC2_CV] -                mov   r8, #0x00 -                str   r8, [r11]                /* Set ssc_tx_pending to 0 */ +                ldr r11, =tc_sniffer_next_buffer_for_fiq +                ldr r11, [r11] +                /* r11 now contains the value of tc_sniffer_next_buffer_for_fiq, e.q. the address +                 * of the next buffer */ -                ldr   r11, =ssc_tx_fiq_fdt_cdiv -                ldr   r11, [r11]               /* r11 == ssc_tx_fiq_fdt_cdiv */ - -/* Problem: LDR from the timer and loop still take too long and cause us to miss the exact time. - * (One load-from-timer,compare,jump-back-if-less cycle are 7 CPU cycles, which are 2 carrier cycles.) - * Strategy: Spin on TC2 till 3 or 4 carrier cycles before the actual time. Then go into an unrolled - * 'loop' for the remaining time. (load-from-timer,compare,jump-forward-if-greater-or-equal are 5 CPU  - * cycles if the condition is not reached.) - *  - * At 47.923200 MHz 7 processor cycles are 2 carrier cycles of the 13.56MHz carrier - */ - .equ SUB_TIME, 4 /* subtract 4 carrier cycles == 14 processor cycles */ -  - 				mov r8, #SUB_TIME - 				sub r11, r11, r8              /* r11 == fdt_cdiv-SUB_TIME */ - -.wait_for_fdt_cdiv: -				ldr   r8, [r12, #TC2_CV] -				cmp   r8, r11 -				blt   .wait_for_fdt_cdiv       /* spin while TC2.CV is less fdt_cdiv-SUB_TIME */ -				 -				mov r8, #SUB_TIME -				add r11, r11, r8               /* r11 == fdt_cdiv */ - -/* Seven copies of the loop contents, covering for 35 CPU cycles, or 10 carrier cycles */ -				ldr   r8, [r12, #TC2_CV] -				cmp   r8, r11 -				bge   .fdt_expired             /* jump forward if TC2.CV is greater than or equal fdt_cdiv */ - -				ldr   r8, [r12, #TC2_CV] -				cmp   r8, r11 -				bge   .fdt_expired              - -				ldr   r8, [r12, #TC2_CV] -				cmp   r8, r11 -				bge   .fdt_expired              - -				ldr   r8, [r12, #TC2_CV] -				cmp   r8, r11 -				bge   .fdt_expired              - -				ldr   r8, [r12, #TC2_CV] -				cmp   r8, r11 -				bge   .fdt_expired              - -				ldr   r8, [r12, #TC2_CV] -				cmp   r8, r11 -				bge   .fdt_expired              - -				ldr   r8, [r12, #TC2_CV] -				cmp   r8, r11 -				bge   .fdt_expired              - -.fdt_expired:				 -				str   r9, [r12, #TC_CCR]       /* SWTRG on TC0 */ -				 -                ldr   r11, =ssc_tx_fiq_fdt_ssc -                ldr   r11, [r11]               /* r11 == ssc_tx_fiq_fdt_ssc */ - -.wait_for_fdt_ssc: -				ldr   r8, [r12, #TC2_CV] -				cmp   r8, r11 -				bmi   .wait_for_fdt_ssc        /* spin while TC2.CV is less fdt_ssc */ +                /* Jump to .no_buffer if the pointer is 0, indicating that no buffer is set */ +                cmp r11, #0 +                beq .no_buffer  -                mov   r11, #PIO_LED1 -                str   r11, [r10, #PIOA_CODR] /* enable LED */ +		/* Increment the value at the location the pointer points to */ +		ldr r8, [r11] +		add r8, r8, #1 +		str r8, [r11] +		 +		/* At this point: +		   r8  = count +		   r9  = TC2.CV +		   r11 = pointer to buffer +		 */ +		 +		cmp r8, #BUFSIZE +		bge .no_buffer +		 +		str r9, [r11, r8, LSL #2] +		 +.no_buffer: +/*                mov     r11, #PIO_LED2 +                str     r11, [r10, #PIOA_SODR] /* disable LED */ -                ldr   r11, =AT91C_BASE_SSC -                mov   r8, #SSC_CR_TXEN -                str   r8, [r11, #SSC_CR]       /* Write TXEN to SSC_CR, enables tx */  - -.no_ssc:                                 /* Trigger PIO_SECONDARY_IRQ */                  mov r11, #PIO_SECONDARY_IRQ_BIT                  ldr r8, =AT91C_BASE_AIC diff --git a/openpicc/os/usb/USB-CDC.c b/openpicc/os/usb/USB-CDC.c index 1b840c9..c005597 100644 --- a/openpicc/os/usb/USB-CDC.c +++ b/openpicc/os/usb/USB-CDC.c @@ -123,7 +123,7 @@ transmitted.  Rx queue must be larger than FIFO size. */  static xQueueHandle xRxCDC;  static xQueueHandle xTxCDC; -#define CHUNK_SIZE 8 +#define CHUNK_SIZE 9  /* Line coding - 115,200 baud, N-8-1 */  static const unsigned portCHAR pxLineCoding[] = @@ -277,7 +277,7 @@ vUSBSendByte_blocking (portCHAR cByte, portTickType xTicksToWait)  #define MIN(a,b) ((a)>(b)?(b):(a))  void -vUSBSendBuffer (unsigned char *buffer, portBASE_TYPE offset, portBASE_TYPE length) +vUSBSendBuffer_blocking (unsigned char *buffer, portBASE_TYPE offset, portBASE_TYPE length, portTickType xTicksToWait)  {  	unsigned char chunk[CHUNK_SIZE];  	while(length > 0) { @@ -285,12 +285,19 @@ vUSBSendBuffer (unsigned char *buffer, portBASE_TYPE offset, portBASE_TYPE lengt  		chunk[0] = next_size;  		memcpy(chunk+1, buffer+offset, next_size);  		/* Queue the bytes to be sent.  The USB task will send it. */ -		xQueueSend (xTxCDC, &chunk, usbNO_BLOCK); +		xQueueSend (xTxCDC, &chunk, xTicksToWait);  		length -= next_size;  		offset += next_size;  	}  } +void +vUSBSendBuffer (unsigned char *buffer, portBASE_TYPE offset, portBASE_TYPE length) +{ +	vUSBSendBuffer_blocking(buffer, offset, length, usbNO_BLOCK); +} + +  /*------------------------------------------------------------*/  portLONG diff --git a/openpicc/os/usb/USB-CDC.h b/openpicc/os/usb/USB-CDC.h index 6074956..6c0a779 100644 --- a/openpicc/os/usb/USB-CDC.h +++ b/openpicc/os/usb/USB-CDC.h @@ -84,6 +84,7 @@ sent unless the port is connected. */  void vUSBSendByte (portCHAR cByte);  void vUSBSendByte_blocking (portCHAR cByte, portTickType xTicksToWait);  void vUSBSendBuffer (unsigned char *buffer, portBASE_TYPE offset, portBASE_TYPE length); +void vUSBSendBuffer_blocking (unsigned char *buffer, portBASE_TYPE offset, portBASE_TYPE length, portTickType xTicksToWait);  portLONG vUSBRecvByte (portCHAR *cByte,portLONG size, portTickType xTicksToWait);  #endif | 
