Autor Tema: mpusbapi.dll  (Leído 1837 veces)

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

Desconectado ziqabo

  • PIC10
  • *
  • Mensajes: 2
mpusbapi.dll
« en: 27 de Mayo de 2008, 10:04:14 »
Hola a todos, antes de nada una presentación, me llamo Alberto y soy de Jaen-España aunque vivo en Sevilla, estoy haciendo un proyecto con pic 18F2550. He seguido los magnificos ejemplos y tutoriales tanto de Redpic como de JM1, he cogido la dll de ejemplo que da microchip y es hay donde me he encontrado con el problema. Dentro de la propia dll he introducido funciones y procedimientos para que desde cualquier programa sea mas facil el uso de esta dll, por ejemplo yo uso solo estas funciones:



Código: [Seleccionar]
DWORD PICCount(void);
DWORD PICInstance(DWORD instance);
PCHAR PICSerialN(DWORD instance);
PCHAR PICFirmware(DWORD instance);
DWORD PICWrite(DWORD instance, PVOID pData);
DWORD PICRead( DWORD instance, BYTE COMMAND,  PVOID pDataRead);
PCHAR DLLVersion(void);

Luego desde Delphi es mas facil su uso:

Código: [Seleccionar]
//Listar Tarjetas
     l1.Clear;
     ndevices:=PICCount;
     for x:=0 to ndevices-1 do begin
              ListItem := l1.Items.Add;
              ListItem.Caption := inttostr(PICInstance(x));
              ListItem.SubItems.Add(PICSerialN(x));
              ListItem.SubItems.Add(PICFirmware(x));
     end;
     l_total.Caption:='DEVICE LIST  TOTAL BOARDS: '+inttostr(ndevices);
     l_version.Caption:=DLLVersion();


//escritura
if PICWrite(id_sel,@buf)<>1 then memo2.Lines.Add('USB ERROR WRITING');
//id_sel es la tarjeta seleccionada de la lista

//leer por ejemplo Conversores analogico digital
if PICRead(id_sel,LEER_ADC,@adcs)<>1 then memo2.Lines.Add('USB ERROR READING');
//LEER_ADC es un comando

Para hacer esto he tenido que modificar la dll para que haga todo los proceso de lectura y escritura, asi como la enumeracion y captura de los SerialNumbers y Firmwares Versions.

Código: [Seleccionar]

**************************************************************
*
*          Devuelve el valor de la instancia
*
**************************************************************
DWORD PICInstance(DWORD instance)
{
    HANDLE tempPipe;

    for(DWORD i = 0; i < MAX_NUM_MPUSB_DEV; i++)
    {

        for (int y=0;y<10;y++)
        {
         tempPipe=MPUSBOpen(i,Vs[y],"",MP_READ,0);
        if(tempPipe != INVALID_HANDLE_VALUE)
        {
          if (i==instance)
            {
                MPUSBClose(tempPipe);
                vid_array[i]=Vs[y];
                seriales[i]=(PCHAR)PICSerialN(i);
                return i;
            }
        }
        }
     MPUSBClose(tempPipe);
    }//end for
    return 999;
}//end

**************************************************************
*
*          Devuelve el SerialNumber por instancia
*
**************************************************************
PCHAR PICSerialN(DWORD instance)
{
    HANDLE myOutPipe, myInPipe;
    PDWORD SentDataLength;
    DWORD  RecvDataLenght;
    PDWORD pLength1;
    BYTE send[64];
    BYTE recv[64];
    PCHAR cadena;
    PCHAR vid_f;

    vid_f=vid_array[instance];

    SentDataLength=0;
    RecvDataLenght=13;
    pLength1=0;

    myOutPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_WRITE, 0);
    myInPipe  = MPUSBOpen(instance,vid_f, "\\MCHP_EP1",  MP_READ,  0);
    if (myOutPipe == INVALID_HANDLE_VALUE || myInPipe == INVALID_HANDLE_VALUE)
    {
        MPUSBClose(myOutPipe);
        MPUSBClose(myInPipe);
        return "Fail GetSN";
    }else{
        send[0]=4; //GET SERIALn
        if (MPUSBWrite(myOutPipe,&send,1,SentDataLength,1000) != 0)
        {
         if(MPUSBRead(myInPipe,&recv,RecvDataLenght,pLength1,1000) != 0)
         {
                cadena=&(char)recv[0];
          }else{
           MPUSBClose(myOutPipe);
           MPUSBClose(myInPipe);
           return "Fail GetSN_READ";
         }
        }else{
         MPUSBClose(myOutPipe);
         MPUSBClose(myInPipe);
         return "Fail GetSN_Write";
        }

       MPUSBClose(myOutPipe);
       MPUSBClose(myInPipe);
       return cadena;
    }



}//end

**************************************************************
*
*          Devuelve el Firrmware Version por instancia
*
**************************************************************
PCHAR PICFirmware(DWORD instance)
{
    HANDLE myOutPipe, myInPipe;
    PDWORD SentDataLength;
    DWORD  RecvDataLenght;
    PDWORD pLength1;
    BYTE send[64];
    BYTE recv[64];
    PCHAR cadena;
    PCHAR vid_f;

    vid_f=vid_array[instance];

    SentDataLength=0;
    RecvDataLenght=7;
    pLength1=0;

    myOutPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_WRITE, 0);
    myInPipe  = MPUSBOpen(instance,vid_f, "\\MCHP_EP1",  MP_READ,  0);
    if (myOutPipe == INVALID_HANDLE_VALUE || myInPipe == INVALID_HANDLE_VALUE)
    {
        MPUSBClose(myOutPipe);
        MPUSBClose(myInPipe);
        return "Fail GetFirmware";
    }else{
        send[0]=2;  //GET FIRMWARE
        if (MPUSBWrite(myOutPipe,&send,1,SentDataLength,1000) != 0)
        {
         if(MPUSBRead(myInPipe,&recv,RecvDataLenght,pLength1,1000) != 0)
         {
                cadena=&(char)recv[0];
          }else{
           MPUSBClose(myOutPipe);
           MPUSBClose(myInPipe);
           return "Fail GetFirmware";
         }
        }else{
         MPUSBClose(myOutPipe);
         MPUSBClose(myInPipe);
         return "Fail GetFirmware";
        }

       MPUSBClose(myOutPipe);
       MPUSBClose(myInPipe);
       return cadena;
    }



}//end

**************************************************************
*
*          Graba un Buffer(pData) en un tarjeta por instancia
*
**************************************************************
DWORD PICWrite(DWORD instance,
                 PVOID pData)
{
    HANDLE myOutPipe, myInPipe;
    PDWORD SentDataLength;
    PCHAR vid_f;

    vid_f=vid_array[instance];

    SentDataLength=0;

    myOutPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_WRITE, 0);
    myInPipe  = MPUSBOpen(instance,vid_f, "\\MCHP_EP1",  MP_READ,  0);
    if (myOutPipe == INVALID_HANDLE_VALUE || myInPipe == INVALID_HANDLE_VALUE)
    {
        MPUSBClose(myOutPipe);
        MPUSBClose(myInPipe);
        return 2;
    }else{
        if (MPUSBWrite(myOutPipe,pData,33,SentDataLength,1000) != 0)
        {
           MPUSBClose(myOutPipe);
           MPUSBClose(myInPipe);
           return 1;
        }else{
         MPUSBClose(myOutPipe);
         MPUSBClose(myInPipe);
         return 0;
        }
    }
}//end

**************************************************************
*
*          Lee un buffer(pDataRad) de una instancia, antes le encia
*          el comando.
*
**************************************************************
DWORD PICRead( DWORD instance,
                 BYTE COMMAND,
                 PVOID pDataRead)
{
    HANDLE myOutPipe, myInPipe;
    PDWORD SentDataLength;
    DWORD  RecvDataLenght;
    PDWORD pLength1;
    BYTE send[64];
    PCHAR cadena;
    PCHAR vid_f;

    vid_f=vid_array[instance];

    SentDataLength=0;
    RecvDataLenght=32;
    pLength1=0;

    myOutPipe = MPUSBOpen(instance,vid_f, "\\MCHP_EP1", MP_WRITE, 0);
    myInPipe  = MPUSBOpen(instance,vid_f, "\\MCHP_EP1",  MP_READ,  0);
    if (myOutPipe == INVALID_HANDLE_VALUE || myInPipe == INVALID_HANDLE_VALUE)
    {
        MPUSBClose(myOutPipe);
        MPUSBClose(myInPipe);
        return 2;
    }else{
        send[0]=COMMAND;
        if (MPUSBWrite(myOutPipe,&send,1,SentDataLength,10) != 0)
        {
         if(MPUSBRead(myInPipe,pDataRead,RecvDataLenght,pLength1,10) != 0)
         {
                MPUSBClose(myOutPipe);
                MPUSBClose(myInPipe);
                return 1;
          }else{
           MPUSBClose(myOutPipe);
           MPUSBClose(myInPipe);
           return 3;
         }
        }else{
         MPUSBClose(myOutPipe);
         MPUSBClose(myInPipe);
         return 0;
        }
    }
}//end


Bueno por ahora todo funciona pero mi duda es que no quiero tener que estar preguntando a la tarjeta su serialnumber ni su firmware, yo tengo esa informacion en el descriptor y me gustaria saber como funciona la funcion MPUSBGetDeviceDescriptor, he intentado varias opciones y nada, ademas no he encontrada ninguna información por la red. Muchas gracias de antemano.

Un saludo. Alberto.


Desconectado ziqabo

  • PIC10
  • *
  • Mensajes: 2
Re: mpusbapi.dll
« Respuesta #1 en: 28 de Mayo de 2008, 04:50:24 »
Alguien a trabajado con libusb-win32???.

Un saludo.