Подробности между файловой системой и USB Mass Storage в vxworks - PullRequest
0 голосов
/ 06 февраля 2020

Я реализую виртуальное запоминающее устройство USB под vxWorks. Здесь есть некоторые проблемы. Драйвер выполнил фазу монтирования, функция которой usb2MscXbdMount.

. Ниже описан процесс, который я прочесал:

usb2MscXbdMount:

taskSpawn(pSvrTaskName,
                                    usrUsb2MscServiceTaskPriorityGet(),
                                    usrUsb2MscServiceTaskOptionsGet(),
                                    (size_t)usrUsb2MscServiceTaskStackSizeGet(),
                                    (FUNCPTR)usb2MscXbdService,
                                    (long)pXbdLun,
                                    0, 0, 0, 0, 0, 0, 0, 0, 0);

эта функция открыла поток usb2MscXbdService, в драйвере usb2MscXbdService выполняется следующее действие:

while ((pBio = usb2MscXbdGetNextBio(pXbdLun)) != NULL)
            {
            USB2_MSC_VDBG("Got new BIO\n", 1, 2, 3, 4, 5, 6);
            usb2MscXbdRunBio (pXbdLun, pBio);
            }

, затем в драйвере usb2MscXbdRunBio(pXbdLun,PBio) выполняется следующее действие:

if (pBio->bio_flags & BIO_READ)
        {
        /* Call the driver's read routine *

        status = pXbdLun->xbdRead(pXbd, 
                                  (UINT32) pBio->bio_blkno,
                                  (UINT32) nblocks,
                                  pBio->bio_data);
        (void) errnoSet(status);       
        }

pXbdLun->xbdRead <==> usb2MscXbdRead, поэтому драйвер переходит к usb2MscXbdRead, в котором выдает команду SCSI: usb2MscScsiRead10, ниже приведена реализация usb2MscXbdRead:

    LOCAL STATUS usb2MscXbdRead
        (
        XBD *     pXbd,                 /* pointer to bulk device         */
        int       startBlk,             /* logical block number           */
        int       numBlks,              /* number of blocks to read       */
        char *    pBuffer               /* store for data                 */
        )
        {
        USB2_MSC_XBD_LUN *      pXbdLun = (USB2_MSC_XBD_LUN *)pXbd;
        USB2_MSC_LUN_DEVICE *   pMscLunDevice = pXbdLun->pMscLunDevice;
        STATUS                  status;
        UINT32                  requiredSize;
        UINT32                  actualSize;

        actualSize =
            requiredSize =
                (UINT32)numBlks * pMscLunDevice->bytesPerSector;

        status = usb2MscScsiRead10(pMscLunDevice,
                                   startBlk,
                                   numBlks,
                                   (UINT8 *)pBuffer,
                                   &actualSize);

        /* Check if transfer succeeded */
        if (status != OK)
            {
            USB2_MSC_ERR("usb2MscScsiRead10 failed,"\
                         " actualSize %d but required %d\n",
                         actualSize, requiredSize,
                         3, 4, 5, 6);

            /* Set the errno to let the filesystem know the failure */
            (void) errnoSet(S_ioLib_DEVICE_ERROR);

            return ERROR;
            }
        else
            {
            return OK;
            }
        }

usb2MscScsiRead10 Generate запрос, который я могу получить.

Я принимаю запрос и вызываю интерфейс libusb в следующие три шага (я выделил некоторые основные моменты):

  • sr c равно 0x55534243 0x00000005 0x00020000 0x80000a28 0x00000000 0x00000001 0x00000000 0x000000

    do {
            r = libusb_bulk_transfer(handle, endpoint, src, 31, &size, 1000);
            if (r == LIBUSB_ERROR_PIPE) {
                libusb_clear_halt(handle, endpoint);
            }
            i++;
        } while ((r == LIBUSB_ERROR_PIPE) && (i < RETRY_MAX));
    
  • dest используется для хранения полученных данных, которые имеют 512 байт, поэтому я здесь не указан , Данные верны, что я проверил.

    do {
            r = libusb_bulk_transfer(handle, endpoint, dest, len, &size, 1000);
            if (r == LIBUSB_ERROR_PIPE) {
                libusb_clear_halt(handle, endpoint);
            }
            i++;
        } while ((r == LIBUSB_ERROR_PIPE) && (i < RETRY_MAX));
    

Затем я вызываю интерфейс libusb для получения csw, и процесс также гарантирует, что он правильный

До тех пор, пока этот шаг не станет нормальным, я получу sr c от драйвера с некоторой ошибкой:

0x55534243 0x00000006 0x00020000 0x80000a28 0x01cdffff 0x00000100 0x00000000 0x0000 * 1051 1052 * 0x1cdffff <==> 30,277,631 <==> 15138816 * 2 (КБ), это емкость моего USB-устройства. но когда я вызываю интерфейс libusb, все данные возвращаются 0x47 (имеют 512 0x47). Теоретически, после этого шага операционная система vxworks может прочитать соответствующую информацию об устройстве и увидеть bd0 после вызова devs.Так кто-нибудь знает подробности c подробностей об этой части, которые привели меня к этой проблеме , спасибо!

...