Перейти к содержанию
    

USB control transfer

LPC1768

HOST взят за основу хост от LPC (который умеет работать с флэшкой)

 

подключаю камеру UVC

 

 

енумерация проходит, стандартные запросы работают такие как установка адреса, установка интерфейса, установка конфигурации, чтение дескриптора.

 

но если пытаюсь послать TYPE_CLASS запрос то он не проходит:

 

rc = Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE,

GET_CUR,

0x0200,

0x0001,

0x0022,

UserBuffer);

 

 

Никто не сталкивался с этим? И ещё не посоветуете где можно было бы подсмотреть читабельные исходники host usb.

 

для работы с изохронными и interrupt передачами...

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Контрольные запросы проходят - не отвечает именно на этот

 

rc = Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_REQUEST_TYPE_CLASS | USB_RECIPIENT_INTERFACE,

GET_CUR,

0x0200,

0x0001,

0x0022,

UserBuffer);

 

не отсылается последний из трёх transfer descriptor - непонятно. Ну да и ладно пока. :rolleyes:

 

 

 

Новый вопрос:

 

почему то не работают interrupt transfers (точнее понятно почему - что-то не так делаю но что ... :smile3046: )

 

HCCA настраиваю (т.е. записываю в массив один указатель на ED)

 

в HC адрес HCCA записываю.

 

ED настроил по аналогии с ED для bulk

 

TD к ED подключил

 

прерывание по передачи TD разрешено (control transfer работают)

 

поля CONTROL в TD и ED не изменяются такие же как и после их инициализации.

 

 

 

Может засовываю в HCCA не вовремя - есть такое предположение.

 

вообщем HC ничего с моим EDinterrupt не хочет делать :crying:

 

 

 

Может кто сталкивался с подобным?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А ты не в курсе как к этому хосту FatFS адаптировать? :rolleyes: Т.е. какие именно функции от этого хоста использовать в качестве низкоуровневых в FatFS от Чана?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Примерно так:

 

DSTATUS USB_disk_initialize(void)
{
        int32_t  rc;
    uint32_t  numBlks, blkSize;
    uint8_t  inquiryResult[INQUIRY_LENGTH];

//    Host_Init();               /* Initialize the lpc17xx host controller                                    */
//    rc = Host_EnumDev();       /* Enumerate the device connected                                            */
    if (usbhost_ms) {
        /* Initialize the mass storage and scsi interfaces */
        rc = MS_Init( &blkSize, &numBlks, inquiryResult );
        if (rc == OK) {
            return FR_OK;
        } else {
            return (FR_DISK_ERR);
        }
    } else {                            
        return (FR_DISK_ERR);
    }

}



DSTATUS USB_disk_status(void)
{
return FR_OK;
}



DRESULT USB_disk_read(
    BYTE *buff,            /* Pointer to the data buffer to store read data */
    DWORD sector,        /* Start sector number (LBA) */
    BYTE count            /* Sector count (1..255) */
    )
{
MS_BulkRecv(sector, count, buff);
return RES_OK;
}




DRESULT USB_disk_write(
    BYTE *buff,    /* Pointer to the data to be written */
    DWORD sector,        /* Start sector number (LBA) */
    BYTE count            /* Sector count (1..255) */
    )
{
MS_BulkSend(sector, count, buff);
return RES_OK;
}


extern    uint32_t  MS_BlkSize;
extern    uint32_t  MS_NumBlks;

DRESULT USB_disk_ioctl (
    BYTE ctrl,        /* Control code */
    void *buff        /* Buffer to send/receive control data */
)
{
    DRESULT res;
    BYTE n, csd[16], *ptr = buff;
    WORD csize;

    res = RES_ERROR;

    if (ctrl == CTRL_POWER)
    {
    res = RES_OK;    
    }
    else {

        switch (ctrl) {
        case CTRL_SYNC :        /* Make sure that no pending write process */
                res = RES_OK;
            break;

        case GET_SECTOR_COUNT :    /* Get number of sectors on the disk (DWORD) */
                    csize = MS_NumBlks;
                    *(DWORD*)buff = (DWORD)csize;
                    res = RES_OK;
            break;

        case GET_SECTOR_SIZE :    /* Get R/W sector size (WORD) */
            *(WORD*)buff = MS_BlkSize;
            res = RES_OK;
            break;

        case GET_BLOCK_SIZE :    /* Get erase block size in unit of sector (DWORD) */
                        *(DWORD*)buff = 1;
                        res = RES_OK;
            break;

        default:
            res = RES_PARERR;
        }

    }

    return res;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...