Autor Tema: Delphi USB y Herramientas - La WinUSB con Delphi  (Leído 24188 veces)

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

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Delphi USB y Herramientas - La WinUSB con Delphi
« en: 06 de Febrero de 2009, 00:39:13 »
Veo que siempre se pregunta como empesar a comunicarse via USB; al parecer no nos hemos dado cuenta que en nuestra paleta exite un componente para USB - HID, el JvHidController de la JVCL.
Ademas en la carpeta jvcl\examples\JvHidController  hay un ejemplo completo.

Usar el CCS me parece una buena alternativa, ya que por el tiempo que lleva de creado tiene una completisima gama de librerias bien implementadas, claro pero no olvidemos que programamos en PASCAL y que exiten herramientas como las de MikroElectronica: MikroPascal, MikroC; con ejemplos incluso para USB. Por supuesto que CCS siempre las ha tenido.

Una pregunta : ¿porque CSS(compilador para C) y todas la herramierntas de MikroElectronica(MikroC, MikroBasic,etc), el WinPic800, icProg y el compilador del MPLAB( MPASM); estan escritas en DELPHI?
« Última modificación: 23 de Junio de 2009, 22:55:26 por fenixariel »

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: JvHidController
« Respuesta #1 en: 06 de Febrero de 2009, 00:43:16 »
Hola, segun mi opinion porque es una herramienta potente y versatil, y aunque hoy por hoy exista C # al Delphi y al Builder es dificil darle, sin ir mas lejos el entorno de los micros FreeScale, el CodeWarrior tambien estan escritos en Delhpi o Builder, por algo sera.

Saludos !

PD. El creador de C# y los entornos .net es el mismo que el Delphi, capisimo ese chabon !
« Última modificación: 06 de Febrero de 2009, 00:59:11 por RICHI777 »

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: JvHidController
« Respuesta #2 en: 06 de Febrero de 2009, 00:51:24 »
Porque la dll de Microchip y la WinUSB no tienen algun evento a la llegada de datos del puerto?

algo mas.... algunos ejemplos como usar WinDriver

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: Componente USB-HID en la JVCL : JvHidController
« Respuesta #3 en: 13 de Febrero de 2009, 17:37:09 »
En vista que parece que el tema USB - Delphi - Pascal - MikroPascal parece un poco oscuro; dejo este link donde se trata el manejo del puerto USB - HID sin drivers.
Delphi USB y Herramientas

Como dije antes podemos optar por usar el componente de la JEDI JvHidController, sin dll ni driver, solo el componente, nada mas.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: USB-HID en la JVCL : JvHidController
« Respuesta #4 en: 14 de Febrero de 2009, 03:13:42 »
Muy interesante, Fenixariel. La verdad es que he tenido oportunidad de probar el MikroC y me causó grata impresión.
La pena es que no tiene tantas librerías como CCS.

Una duda: ¿los programas en Delphi funcionan también en Linux?

Desconectado mariano_pic

  • PIC18
  • ****
  • Mensajes: 498
    • Software Electronica Microncontroladores
Re: USB-HID en la JVCL : JvHidController
« Respuesta #5 en: 14 de Febrero de 2009, 11:49:08 »
Muy interesante, Fenixariel. La verdad es que he tenido oportunidad de probar el MikroC y me causó grata impresión.
La pena es que no tiene tantas librerías como CCS.

Una duda: ¿los programas en Delphi funcionan también en Linux?
   Kilix es delphi en linux, pero tienes que tener la libreria JavaVcl, tambien esta lazarus que es ObjectPascal y trabaja tanto en linux como en windows  :)
 Acerca de mikroc, es facil de usar pero no le llega por los pies a ccs, a mi me pasa que habese compila mal, o que guardas los cambios y es como si nada, eso referente al ide, y el compilador es malisimo, ademas que las librerias estan compiladas y no puedes ver como estan hechas como en ccs. yo utiliso los dos compiladores, cuando mikroc es mas facil de utilizar lo uso, o ccs si mikroc me da problemas  :o
« Última modificación: 14 de Febrero de 2009, 11:52:49 por mariano_pic »
Necesitas ayuda para tu proyecto electronico?
buscame, tal ves pueda colaborarte.
Blog: http://electronicosembebidos.blogspot.com.co/
mail: electronicosembebidos@gmail.com
Mi grupo de facebook: https://www.facebook.com/groups/ProgramandoPics/

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: USB-HID en la JVCL : JvHidController
« Respuesta #6 en: 14 de Febrero de 2009, 21:55:36 »
Delphi en Linux? ojala Embarcadero reflote Kilyx como se merece.

He usado CCS y en verdad esta mejor implemetado que los productos de MikroElectronica en cuanto a las librerias y la razon es que CCS lleva mucho mucho mas tiempo de desarrollo que MikroElectronica; aunque si te fijas en todo el mundo en cuanto a marketing MikroElektronica lo hace mejor que CCS.

Si quieres el codigo fuente de las librerias de MikroC o MikroPascal creo que te cobran mas por eso.

Personalmente el IDE de MikroElectronica me parece mejor, al menos en las versiones superiores a la 8.00.

Total ambas son aplicaciones Delphi.

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: Delphi USB y Herramientas
« Respuesta #7 en: 06 de Marzo de 2009, 23:37:14 »
No puedo soportar como siendo Delphi Pascal lenguajes tan potentes, sus usuarios tengan que padecer tanto con e puerto USB,

como dice el gran RedPic: en Delphi el  USB esta desencadenado:

Club Delphi:

http://www.clubdelphi.com/foros/showthread.php?t=63152

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
La WinUSB con Delphi
« Respuesta #8 en: 23 de Junio de 2009, 22:42:44 »
Nota: En este post se hace referencia a articulos en las paginas de Club Delphi:
USB-HID(micropascal, componente hid de la JEDI), USB-Bulk(CCS-mpusbapi.dll v1.0.0 y v1.1.0).


Como sabemos la WinUSB está habilitada en Windows XP, Windows Vista, Windows Server 2008 y Windows 7.

Pero solo viene incluido en el sistema desde Windows Vista; en XP es necesario instalarla.

Tanto la WinUSB y la mpusbapi.dll v1.1.0.0 de Microchip son compatibles con Windows Vista.

Recordemos que la norma USB dispone de 4 tipos para transmisión de datos:

·Control
·Bulk
·Interrupt
·Isochronous

Y varias clases de dispositivos posibles:

·USB audio device
·USB Communications device
·USB human interface device(HID)
·USB printer device
·USB massstorage device
·USB hub device
·USB smart card reader device
·USB video device
·USB wireless device
·Etc.

Pero la WinUSB no soporta el tipo de transmisión Isochronous.

Cuando instalamos la WinUSB se crea el archivo winusb.sys en el directorio del sitema, que es en realidad el driver con el que nuestra aplicación se comunicara para manejar nuestro dispositivo USB; para instalarla son necesarios los siguientes archivos:

1. WinUSBCoInstaller.dll
2. WdfCoInstaller01007.dll
3. Un .inf para instalar la winusb.sys.

Estos archivos deben de coincidir con la arquitectura de la CPU: x86 o x64; y vienen incluidas con la Windows Driver Kid (WDK).

La documentación basica de como realizar todo el proceso para crear el software se puede encontrar en :
“How to Use WinUSB to Communicate with a USB Device.pdf”, la cual tambien adjunto en el archivo del proyecto.

La documentación sobre las funciones de la WinUSB, la podemos encontrar en la ayuda de: Visual Studio, Rad Studio 2009, y en la propia documentación de la Windows Driver Kid (WDK), Solo bastara buscarlas como: “WinUSB User-Mode Client Support Routines”.

La WinUSB consta de 20 funciones, de las cuales muchas solicitan o devuelven parámetros estructurados (record).

A diferencia de la dll de Microchip, esta no posee una función que directamente devuelva el handle al dispositivo USB, la función de la WinUSB: WinUSB_Initialize(), requiere que se le pase el manejador al dispositivo…es decir esto se tiene que hacer a mano; a diferencia de la dll de Microchip,
que para inicializarla solo requería pasarle el VID and PID y nos retornaba el handle.

Delphi :

El handle requerido por la WinUSB_Initialize () lo podemos conseguir pasando el path del dispositivo (si revisamos este lo podemos encontrar en el registro de Windows), a la conocida función CreateFile(); hasta aquí todo bien, pero para conseguir este path es necesario hacer uso de varias funciones de la SetupApi.dll, la cual no está importada en Delphi (lo estará en D2009?).

Asi que nos queda 2 alternativas la importamos nosotros mismos o hacemos uso de las fantásticas utilidades del PROJECT JEDI.

La JEDI API Library, (descargar "scapi - Setup & Config Manager API") tiene importadas todas estas funciones (cosa que podríamos hacer pero tal vez no tan eficientemente o podemos inventar nuevamente la rueda),
para usar esta librería de unidades solo tenemos como es costumbre que agregarla a Environment Options\Library\Library path.

Otro detalle es que algunas de las funciones que usamos de la SetupApi necesitan un GUID para la interface del dispositivo (GUID_DEVINTERFACE),
este valor también deberá ser incluido en el archivo INF (MyWinUSB.inf); la forma como el driver winusb.sys se reconoce como controlador de
nuestro dispositivo USB.

Este GUID lo podemos generar haciendo Ctrl+Shift+G (ó Ctrl+Mayus+G) en el editor de Delphi.

El projecto consta de 3 unidades: el program en si, la importacion de las funciones de la WinUSB.dll y la unidad en las que se declaran los parametros estructurados para las funciones de la dll.


Código: Text
  1. .
  2. .
  3. .
  4.  
  5. Const
  6.    //La interface GUID ubicada en al seccion [Dev_AddReg] del  .inf
  7.    GUID_DEVINTERFACE: TGUID        = '{9FD6FF49-05EC-49C4-9B78-371937D1E315}';  
  8.  
  9.    //constante para la funcion WinUsb_QueryDeviceInformation - referirse a la doc de la WinUSB
  10.    DEVICE_SPEED                    =  $001;
  11. .
  12. .
  13. .
  14. //SetupApi unidad de la JEDI API Library
  15. uses WINUSBDll, TypesDll, SetupApi;
  16. .
  17. .
  18. .
  19. //casi todas las funciones aqui son de la SetupApi
  20. //documentacion al respecto en la ayuda de: visual studio,
  21. //C++/Delphi 2009, Windows Driver Kit(WDK)
  22. function TForm1.GetDevicePath: THandle;
  23. var
  24.    BytesReturned           : DWORD;
  25.    LPGUID                     : TGUID;
  26.    DeviceInfo                : HDEVINFO;
  27.    DeviceInterfaceData   : TSPDeviceInterfaceData;
  28.    DetailData                 : PSPDeviceInterfaceDetailData;
  29. begin
  30.   LPGUID := GUID_DEVINTERFACE;
  31.   DetailData:= nil;
  32.   GetDevicePath:= INVALID_HANDLE_VALUE;  
  33.  
  34.   //SetupDiGetClassDevs : obtiene un handle hacia la informacion de la device
  35.   DeviceInfo:=SetupDiGetClassDevs(@LPGUID, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);  
  36.  
  37.   if not(DeviceInfo = Pointer(INVALID_HANDLE_VALUE)) then
  38.   begin
  39.     //inicializa la estructura TSPDeviceInterfaceData
  40.     DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);    
  41.  
  42.     //SetupDiEnumDeviceInterfaces : enumera todas las interfaces de las devices
  43.     if SetupDiEnumDeviceInterfaces(DeviceInfo, nil, LPGUID, 0, DeviceInterfaceData)  then
  44.     begin
  45.        //SetupDiGetDeviceInterfaceDetail : obtiene detalles de la informacion de la interface
  46.        //de nuestra deviceestos datos son almacenados en la estructura TSPDeviceInterfaceDetailData
  47.        if not SetupDiGetDeviceInterfaceDetail(DeviceInfo, @DeviceInterfaceData, nil, 0,
  48.                                                            BytesReturned, nil) then
  49.        begin
  50.           DetailData := AllocMem(BytesReturned);          
  51.  
  52.          if DetailData =  Pointer(INVALID_HANDLE_VALUE) then
  53.           begin
  54.              SetupDiDestroyDeviceInfoList(DeviceInfo);
  55.              GetDevicePath:=INVALID_HANDLE_VALUE;
  56.           end;
  57.           DetailData.cbSize:= SizeOf(TSPDeviceInterfaceDetailData);          
  58.  
  59.           //SetupDiGetDeviceInterfaceDetail : obtiene el tamño correcto para la estructura
  60.           //TSPDeviceInterfaceDetailData
  61.           if SetupDiGetDeviceInterfaceDetail(DeviceInfo, @DeviceInterfaceData, DetailData,
  62.                                              BytesReturned, BytesReturned, nil) = false  then
  63.           begin
  64.              FreeMem(DetailData);
  65.              GetDevicePath:=INVALID_HANDLE_VALUE;
  66.           end;          
  67.  
  68.          if DetailData.DevicePath = '' then
  69.           begin
  70.              SetupDiDestroyDeviceInfoList(DeviceInfo);
  71.              FreeMem(DetailData);
  72.           end;          
  73.  
  74.           //obtenemos un handle para la device
  75.           GetDevicePath := CreateFile(DetailData.DevicePath, GENERIC_WRITE or GENERIC_READ,
  76.                                       FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
  77.                                       FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0 );
  78.           FreeMem(DetailData);      
  79.        end;
  80.     end;
  81.  
  82.   end;
  83.  
  84. end;

Las funciones de la WinUSB nos permiten obtener abundante información sobre el descriptor en el PIC

PIC :

El código en el PIC es el mismo que usamos anteriormente compilado con el CCS C: USB_Bulk.

INF :

para detalles sobre el .INF debemos referirnos al apartado "How to Install WinUsb.sys as a Function Driver" del documento
“How to Use WinUSB to Communicate with a USB Device.pdf”

y al capitulo 9 del libro "Usb Complete - Everything You Need To Develop Custom Usb Peripherals" de Jan Alelxon

En el archivo MyWinUSB.inf son importantes los dos GUID que se deben incluir

1. ClassGuid: este valor puede ser eligido de entre los definidos en C:\WinDDK\6001.18002\inc\api\ devguid.h
(carpeta de instalscion de la WDK); pero se acostumbra usar uno propio.

2. DeviceInterfaceGUIDs en la sección [Dev_AddReg]:
este GUID es el mismo que está incluido en el código Delphi, el GUID para la interface de nuestro dispositivo USB.

Podemos generar un GUID haciendo Ctrl+Shift+G (ó Ctrl+Mayus+G) en el editor de Delphi.

Algo rapido:

1. grabar el .hex en el PIC
2. Al conectar el cable te pedira el driver, elije la carpeta "\My WinUSB with Delphi\PC\Driver".
3. Listo ejecuta MyWinUSB.exe

el proyecto completo se puede descargar de:

My WinUSB con Delphi.rar
 

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 899
Re: Delphi USB y Herramientas - La WinUSB con Delphi
« Respuesta #9 en: 24 de Junio de 2009, 01:05:03 »
Si quieren establecer una comunicación Delphi - pic en modo HID les recomiendo la herramienta EasyHid de Mecanique. Este programa genera código tanto para el pic (en basic) como para la pc (Visual C, Delphi y Visual Basic). Tiene asistente y es muy facil de usar. Yo lo he usado solamente para generar el codigo en Delphi, para el pic uso ccs.

Por cierto, una alternativa a Kilix es Lazarus
http://www.lazarus.freepascal.org/
No lo he probado pero según, el ide es identico a Delphi y es multiplataforma.

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: Delphi USB y Herramientas - La WinUSB con Delphi
« Respuesta #10 en: 04 de Julio de 2009, 15:23:42 »
Tienes razon Duende Azul, la mcHID.dll que es la dll que utiliza la EasyHID esta muy bien echa y bastante flexible, pero no tenemos a mano el codigo fuente de la dll.

Tambien tenemos que probar el componente HId de la JEDI, en la pestaña system,
y por cierto la Jedi acaba de lanzar su version 3.37, totalmente compatible con D 2009.

ejemplos y projecto completo al respecto en: http://www.clubdelphi.com/foros/showthread.php?t=63152

Desconectado tomywong

  • PIC10
  • *
  • Mensajes: 1
Re: Delphi USB y Herramientas - La WinUSB con Delphi
« Respuesta #11 en: 09 de Enero de 2011, 21:53:31 »
Hi fenixariel,

http://www.mediafire.com/file/54yum43mz4n/My%20WinUSB%20With%20Delphi.rar
Link is dead.

Can you please send it again ?
Thank you very much.

-Tomy

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: Delphi USB y Herramientas - La WinUSB con Delphi
« Respuesta #12 en: 31 de Marzo de 2011, 22:46:06 »
Perdon por el link; este es bueno:      My_WinUSB_With_Delphi




Saludos...


 

anything