Bueno, después de un retraso inesperado regresé a lo del USB.
Logré mejorar el tiempo de ejecución de la función usb_put_packet de 740us a 570us.
Básicamente reduje el tiempo usando constantes de direcciones RAM, eliminé unas rutinas redundantes en las que se hace el toggle del PID DATA0 o DATA1, coloqué el buffer a enviar en el mismo banco de los endpoint USB (banco 5 0x05C0) y quité la opción de enviar 1024bytes por paquete ya que en HID el máximo es de 64bytes.
La función siempre espera a que el endpoint esté disponible (UOWN = 0) para manipularlo, no es como la de CCS que entrega un 0 si no pudo manipularlo. Esta se espera hasta que se puede.
Todavía me falta mejorar el tiempo de otras funciones, pero bueno 170us de ahorro son algo
Descarga usb_fast.h
http://www.4shared.com/file/106692845/cb1ba8bd/usb_fast.htmlPara implementarla solo se requiere:
- Solo debe haberse configurado el EP0 y EP1
- Paquete debe ser de hasta 64bytes de largo
- El buffer a enviar deberá iniciar en 0x05C0 (banco 5, usar #locate)
- El PID de la transacción lleva toggle DATA0 y DATA1
El prototipo de la función es más simple:
/*
Librería USB Fast
Santiago Villafuerte
http://www.migsantiago.com
*/
#define STATUS_EP1_IN 0x040C
#define UOWN 7
#define DTS 6
#define CNT_EP1_IN 0x040D
#define ADRL_EP1_IN 0x040E
#define ADRH_EP1_IN 0x040F
////////////////////////////////////////////////////////////////////////////////
//Función put_usb_fast1
//Ejecuta put_usb_packet de forma rápida para el endpoint 1
//
//Requisitos:
//- Solo debe haberse configurado el EP0 y EP1
//- Paquete debe ser de hasta 64bytes de largo
//- El buffer a enviar deberá iniciar en 0x05C0 (banco 5)
//- El paquete lleva toggle DATA0 y DATA1
//
void usb_put_fast_1(int8 *buffer, int8 len)
{
int8 i;
int8 *buffer_ep1;
//Copia la dirección del buffer ep1
buffer_ep1 = *(int16 *)ADRL_EP1_IN;
//Espera a que la SIE deje de manipular el endpoint
while(bit_test(*(STATUS_EP1_IN),UOWN));
//Copia los bytes del buffer al endpoint
//Es recomendable que buffer esté ubicado en las 64 últimas posiciones del
//banco 5 para reducir tiempo entre saltos de banco
for(i=0; i<len; ++i)
{
*buffer_ep1 = *buffer;
++buffer_ep1;
++buffer;
}
//Indica cuántos bytes de enviarán (no hace falta escribir BC9:BC8)
*(CNT_EP1_IN) = len;
//Invierte el bit de datos de paquete DTS (data toggle sync) y
//activa el envío del endpoint levantando UOWN
if(bit_test(*(STATUS_EP1_IN),DTS))
*(STATUS_EP1_IN)= 0b10001000; //UOWN=1, DTS=0, DTSEN=1
else
*(STATUS_EP1_IN)= 0b11001000; //UOWN=1, DTS=1, DTSEN=1
}
////////////////////////////////////////////////////////////////////////////////