Я реализую виртуальное запоминающее устройство 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 подробностей об этой части, которые привели меня к этой проблеме , спасибо!