Autor Tema: Dudas USB y 12Mbps  (Leído 43325 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dudas USB y 12Mbps
« Respuesta #60 en: 08 de Agosto de 2009, 23:25:18 »
jaja bueno he estado haciendo pruebas rapidas y pues, seguro se me paso por alto eso, a pesar de creer que lo hice todo correctamente. Ya seguire con esas pruebas, ahora, estoy teniendo problemas con otra cosa y pues nada, estare probando luego.

Gracias, salu2.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #61 en: 10 de Agosto de 2009, 12:35:10 »
Nunca pude usar HID con mpusbapi.dll.
Nadie hombre. He estado buscando info en el foro, en san google y nada, no he encontrado nada. Tan dificil o algo asi es xD!


Salu2

la respuesta es sencilla. mpusbapi.dll fué creada unicamente para manejar el modo BULK, los otros modos CDC y HID son clases, esto significa que son estandares que los sistemas operativos reconocen y traen en sus sistemas.

con BULK tienes que usar librerias (aunque se puede embeber el código fuente de mpusbapi.dll en la aplicación según leí en un post del amigo Jesús)

con CDC solamente necesitas un .inf para configurar el dispositivo.

con HID no necesitas NADA, enchufas y listo.


La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dudas USB y 12Mbps
« Respuesta #62 en: 10 de Agosto de 2009, 13:14:09 »
Bueno, pero la mpusbapi.dll sus funciones tb estan disponibles para manejar pipes de interrupcion, osea HID y, es mas, hasta el modo iscocrono. Aun asi, ya estoy bien con la mencionada antes, va bien!

Salu2.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #63 en: 10 de Agosto de 2009, 13:26:02 »
bueno yo no le he estudiado a fondo como funciona la dll, pero esos conceptos que mencionas estan en capas inferiores y se siguen usando en ambas clases. Los pipes siempre se crearan ya sea en hid o en bulk.

lo que pasa es que hablar de HID y modo isócrono son 2 cosas distintas, el usb es tab complejo que cuando se reunen un conjunto de caracteristicas, le asignan un nombre, lo separan y lo juntan en una "capa"

modos de transferencias:

http://usuarios.lycos.es/kurganz/datos_tecnicos/protocolo/prototrans.html

HID CDC MSD son interfaces o relación de software-dispositivo. Microchip no deberia mezclar BULK con HID porque son 2 cosas distintas,

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Dudas USB y 12Mbps
« Respuesta #64 en: 12 de Agosto de 2009, 18:42:11 »
Migsantiago, era eso. Ya lo probe bien todo y ahora me devuelve bien todo, gracias.

Gracias por la info tb Pali.


Salu2.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #65 en: 12 de Agosto de 2009, 18:47:43 »
Vientos Jeremy.

A ver si en este semestre logro acelerar el USB del PIC con el modo ping pong, porque el pasado con la influenza y demás detalles me estanqué en esto.  :police:

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #66 en: 25 de Agosto de 2009, 14:39:05 »
Bueno pues les traigo noticias sobre mis problemas  :D

Al fin he logrado que el PIC18F2550 pueda enviar 50 bytes cada 1ms usando modo HID.

Se sabe que el HID trabaja hasta 64kB/s en Full Speed. Esto se debe a que se configura un polling de 1ms con paquetes de 64bytes, por lo que en 1s se tienen 64,000 bytes enviados. HID en USB 2.0 no permite el uso de más de 2 endpoints: uno del tipo control para el setup y otro para datos interruptivo. Si hubiera más EP's la historia sería otra.

Al usar el ejemplo HID que CCS trae estos tiempos son imposibles de alcanzar ya que las librerías vienen muy generalizadas y ejecutan muchas instrucciones que toman mucho tiempo.

En uno de tantos intentos integré el uso del modo ping pong en el pic, pero por más que le busqué no encontré porqué el pic se desenumeraba  :oops:

Tuve que estudiar el funcionamiento de los Buffer Descriptors, la SIE y el procedimiento de envío de paquetes y para lograr un envío de 50kB/s esto es lo que hice.

- Configurar el HID con endpoint 1tx de 50 bytes de tamaño y 1ms de polling. El endpoint 1rx puede tener cualquier tamaño y polling (por ahora no lo usaré excesivamente).

- Mi muestreo se hace en una subrutina con el timer0 cada 40us, escribiendo 2 bytes por evento, teniendo 50bytes cada 1ms. Esta subrutina escribe en el primer buffer clon... directamente sobre la USB ram. Cuando se llena el buffer pasa al segundo buffer y así sucesivamente. En total hay 4 buffers de 50 bytes cada uno, localizados en estas direcciones de la usb ram (todas en el banco 6):

Buffer1 0x0600 a 0x0631
Buffer2 0x0632 a 0x0663
Buffer3 0x0664 a 0x0695
Buffer4 0x0696 a 0x06C7

- Cuando algún buffer se ha llenado entonces en el main se llama una función de envío USB que hace lo siguiente:
   + Recibe el número del buffer que está listo para envío
   + Espera indefinidamente que la SIE deje de controlar el endpoint 1
   + Escribe en el BD_CNT del EP1 el número 50 que equivale a los bytes a enviar por paquete (o reporte)
   + Modifica el ADRL_EP1 y ADRH_EP1 con la dirección ram del inicio del buffer a enviar
   + Invierte el bit DTS que sirve para dar paridad a los paquetes, de forma tal que si el paquete anterior es un DATA0, entonces el siguiente sea un DATA1
   + Por último levanta la bandera de la SIE que activa el envío del buffer cuando el HOST lo indique. Esto sucederá exactamente cada 1ms.

La ventaja de usar 4 buffers clones es que mientras la SIE está manipulando los 50 bytes de un buffer, yo me doy el lujo de estar preparando otro buffer para enviarlo. Esto es similar al modo ping pong, pero con trampa  :D

Otra ventaja que tiene mi función de envío es que el buffer ya está ubicado en la usb ram. La función de CCS mueve un buffer de la ram del usuario a la usb ram y eso toma tiempo. También se tarda porque espera a que la SIE pierda control de la ram, mientras que mi función garantiza que la usb ram está más que lista para salir del pic.

Código: [Seleccionar]
void usb_put_fast_1(int8 buffer, int8 len)
{
//Espera a que la SIE deje de manipular el endpoint
while(bit_test(*(STATUS_EP1_IN),UOWN));

//Indica cuántos bytes se enviarán (no hace falta escribir BC9:BC8)
*(CNT_EP1_IN) = len;

//Indica el comienzo del buffer a la SIE
//El byte alto siempre es 0x06
*(ADRH_EP1_IN) = 0x06; //primer buffer
//El byte bajo sí cambia
switch(buffer)
   {
   case 1:
      *(ADRL_EP1_IN) = 0x00; break;
   case 2:
      *(ADRL_EP1_IN) = 0x32; break;
   case 3:
      *(ADRL_EP1_IN) = 0x64; break;
   case 4:
      *(ADRL_EP1_IN) = 0x96; break;
   }

//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
}

Después para verificar que el pic realmente estuviera enviando los datos en tiempo y forma usé un analizador usb por software y otro por hardware.



En la imagen se ve que cada que el HOST envía un paquete del tipo Start Of Frame también envía un paquete IN al pic pidiéndole los 50 bytes. El SOF en Full Speed es cada 1ms por lo que el PIC funciona como debe.

Y bueno... ahora la segunda problemática... leer desde Windows esos paquetes cada 1ms sin perderlos. Difícil porque Windows no garantiza ejecución de código en tiempos tan pequeños... pero bueno. A ver qué se me ocurre  :D

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #67 en: 25 de Agosto de 2009, 16:56:56 »
vaya, ya tienes resuelto mas de la mitad del problema  :-/ :-/

...La ventaja de usar 4 buffers clones es que mientras la SIE está manipulando los 50 bytes de un buffer, yo me doy el lujo de estar preparando otro buffer para enviarlo. Esto es similar al modo ping pong, pero con trampa  :D
...

eso me recuerda a un tema del que estoy ansioso por meterle mano, se llama buffer circular.

http://en.wikipedia.org/wiki/Circular_buffer

se trata de usar una porción de memoria RAM y manipularlo en forma de arrays, e ir introduciendo datos de muestras e ir sacando datos de muestras. La idea es no detener un proceso síncrono o en tiempo real.

los sistemas de multimedia usan ese mismo proceso, Santiago me imagino que a estas alturas habrás notado que cualquier transferencia que se haga a un ordenador se hace por rafagas, asi que para mantener un muestreo en tiempo real, hay que montar un buffer circular del lado del pic y otro de lado del software del ordenador.

Esto yo lo veo maravilloso porque asi hacemos cualquier proceso de ejecución independiente de la velocidad de operación del micro. -¡Ven!- -ya me dieron ganas de ponerme a estudiar otra vez-  :mrgreen:

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #68 en: 25 de Agosto de 2009, 20:24:39 »
jajaja ¿y qué tiene de malo estudiar?  :D

Recuerdo el asunto del buffer circular, me lo recomendaste en este mismo tema... al parecer me sirvió de mucho  :D La pregunta es ¿para qué lo piensas usar?

Por otro lado estuve leyendo el USB complete de Jan Axelson y me enteré de que hay forma de usar la hid.dll como API. También hay forma de escribir drivers que manejan los devices directamente desde el kernel de Windows... acarreando la ventaja de que podría leer el usb cuando yo quiera ya que el kernel sí garantiza tiempos.

Vamos a ver qué puedo lograr  :D

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #69 en: 27 de Agosto de 2009, 16:17:35 »
...Recuerdo el asunto del buffer circular, me lo recomendaste en este mismo tema... al parecer me sirvió de mucho  :D La pregunta es ¿para qué lo piensas usar?
...

para muchas cosas, con esas limitaciones de velocidad que tienen los pics...  :-)



La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #70 en: 27 de Agosto de 2009, 16:52:46 »
Bueno pues leyendo el libro de Jan Axelson descubrí que el host usb cuenta con un ring buffer para almacenar los reportes HID mientras Windows no los recupere. Cuando el buffer se llena, el host borra el reporte más viejo.

Ya estoy escribiendo mi librería HID y la voy a implementar para poder leer más bytes que los que acarrea un simple paquete. Con esto espero vaciar el ring buffer más rápido sin tener el problemilla de 1ms de latencia... más reportes por leída.



Este buffer circular está en todas partes Pedro  :D

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #71 en: 31 de Agosto de 2009, 13:03:45 »
Haciendo uso del libro USB Complete de Jan Axelson pude recibir los paquetes de mi PIC en modo HID sin tener pérdidas de información. Es necesario importar algunas funciones de las librerías internas de Windows XP: hid.dll, setupapi.dll y kernel32.dll.

Cuando Windows enumera un dispositivo HID y lo pasa al estado CONFIGURED es cuando el dispositivo comienza a enviar los reportes o paquetes cada que el host se lo indique, entendiendo host como hardware USB y no Windows.

El periodo del polling en los HID va desde 1ms hasta 255ms. Mi PIC quedó configurado a 1ms con reportes de 50bytes. Este periodo de 1ms es altamente exacto porque depende del host y no del scheduler de procesos de Winxp.

El kernel de windows se encarga de recibir los reportes que el pic envía cada 1ms y los almacena en un buffer circular. Este buffer tiene un tamaño predeterminado de 32 reportes en Windows XP y 2 reportes en Windows 98.

El usuario debe leer estos reportes antes de que el buffer circular se llene. Si llegan 33 reportes y no se lee el buffer entonces el reporte más viejo es sobreescrito y por lo tanto perdido.

Si cada reporte llega exactamente cada 1ms, entonces con 32 reportes es necesario que el usuario vacíe el buffer cada 32ms o menos. Mi problema era que las librerías que andan por internet solo leen un reporte por evento y para cuando se quiere leer otro, los viejos ya fueron sobreescritos.

Tuve que escribir mis propias importaciones de funciones para no perder paquetes. Las funciones importantes y que no vienen completas en el libro de Jan son:

Código: [Seleccionar]
       [DllImport("kernel32.dll", SetLastError = true)]
        internal static extern Boolean ReadFile(
            SafeFileHandle hFile,
            byte[] buffer, //IntPtr lpBuffer,
            Int32 nNumberOfBytesToRead,
            ref Int32 lpNumberOfBytesRead,
            IntPtr lpOverlapped);

        //Investiga tamaño del ring buffer de input reports
        [DllImport("hid.dll", SetLastError = true)]
        public static extern Boolean HidD_GetNumInputBuffers(
            SafeFileHandle HidDeviceObject,
            ref Int32 NumberBuffers);

        //Establece tamaño del ring buffer de input reports
        [DllImport("hid.dll", SetLastError = true)]
        public static extern Boolean HidD_SetNumInputBuffers(
            SafeFileHandle HidDeviceObject,
            Int32 NumberBuffers);

- GetNumInputBuffers
http://msdn.microsoft.com/en-us/library/ms790938.aspx
Sirve para leer el tamaño del buffer circular.

- SetNumInputBuffers
http://msdn.microsoft.com/en-us/library/ms790946.aspx
Sirve para cambiar el tamaño del buffer circular. Entre más grande el buffer circular menos frecuentemente habrá que hacer lecturas al mismo. Bajo Windows XP este buffer puede almacenar hasta 512 reportes.

- ReadFile
Después de obtener un handle al dispositivo USB se pueden leer de un solo paso todos los reportes que estén en el buffer circular, pidiendo nNumberOfBytesToRead como (reportes * bytes_por_reporte).

Al configurar el buffer circular con 512 reportes se tiene un alamcenamiento de hasta 512ms de datos, obligando al usuario a solo vaciar el buffer cada 512ms o menos. Esto es bastante fácil de lograr con timers incluidos en Visual Studio sin importar cuanta carga tenga el CPU de Windows.

Un muestreo de 32ms pone mucha carga al procesador mientras que uno de 512ms es más ligero.

Gracias a estas funciones y que el kernel de windows nos guarda los paquetes temporalmente es posible leer datos a 50kB/s desde un PIC en modo HID sin pérdida de paquetes.

Velocidades de hasta 64kB/s por interfaz USB son posibles ya que el endpoint HID interruptivo puede enviar hasta 64bytes por polling.

Con esto doy por terminado este hilo que duró como medio año abierto, pero así es esto del USB, hay que leer por todos lados para aprenderlo a usar como debe ser.

Gracias a los que me ayudaron en esto espero poder publicar una DLL con estas mejoras algún día... todavía me estoy peleando con la búsqueda de varios PICs al mismo tiempo.
« Última modificación: 31 de Agosto de 2009, 13:07:54 por migsantiago »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #72 en: 03 de Septiembre de 2009, 21:57:53 »
Hola

Les dejo el link a mi página en donde pueden descargar el probador de HID's (no solo de pics). Es útil para ver si su pic está bien enumerado y si les está enviando los paquetes que ustedes requieren.

Prueba tu HID con SL HID Tester
http://migsantiago.com/index.php?option=com_content&view=article&id=15&Itemid=17

Basado en el código fuente de Jan Axelson www.lvr.com y su libro.  ;-)

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Dudas USB y 12Mbps
« Respuesta #73 en: 03 de Septiembre de 2009, 22:02:34 »
que mas puedo decir Maestro Santiago:






uno solito please!!! te lo mereces
« Última modificación: 04 de Septiembre de 2009, 12:43:06 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Dudas USB y 12Mbps
« Respuesta #74 en: 03 de Septiembre de 2009, 22:19:30 »
jajaja

No es para tanto Pedro, la magia la hace la Sra. Jan Axelson con sus tutoriales mega excelentes.  ;-)

Borra por favor los muñequitos que me siento invadido y sobrepasado :D