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

Не определяется USB устройство

Доброго дня!

 

Устройство должно определяться как Mass Storage Device. Контроллер Blackfin BF548. Драйвер родной от ADI.

 

Подключаю устройство к своему андроид-телефону через OTG кабель - все работает. Подключаю к своему компу с Win7 - в диспетчере устройств появляется 2 пункта (см. картинку), но новый том в Администрирование->Управление компьютером->Управление дисками не появляется и этот пункт при открытии "подвисает". Пробовал удалять драйвера USB, заменял дефолтными. Картина та же. При загрузке Windows в "Безопасном режиме" мой прибор определяется, можно читать/записывать, но не форматируется. На компе с WinXP у коллеги - все OK.

 

Чем мое устройство не угодило Win7 ?

post-56634-1437568542_thumb.jpg

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


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


Все. Разобрался, вроде. В драйвере было одно место, где обрабатывался запрос на описание устройства
case SCSI_INQUIRY:
            if(pCommandBlock[1] == 0)
            {
                if (datalen  == sizeof (adi_msd_InquiryReport))
                {
                    memcpy(pBuffer, &adi_msd_InquiryReport, datalen);
                    return (true);
                }
            }
            else // Added for Windows Vista
            if(pCommandBlock[1] == 1)
            {
                memcpy(pBuffer, &adi_msd_InquiryReport_1, 36);
                *pActualBytesToReturn = 36;
                return(true);
            }
            break;

 

Когда хост запрашивал большее количество байт, чем было у драйвера MSD контроллера - он ( драйвер моего устройства) запрос игнорировал.

 

Исправил на следующее:

case SCSI_INQUIRY:
            if(pCommandBlock[1] == 0)
            {
                size_t BytesToCopy;
                
                if (datalen >= SCSI_INQUIRY_REPORT_SIZE)
                {
                    BytesToCopy = SCSI_INQUIRY_REPORT_SIZE;
                }
                else
                {
                    BytesToCopy = datalen;
                }
                
                memcpy(pBuffer, &adi_msd_InquiryReport, BytesToCopy );
                
                *pActualBytesToReturn = BytesToCopy;
                    
                bResult = true;
                break;
            }
            else // Added for Windows Vista
            {
                if(pCommandBlock[1] == 1)
                {
                    memcpy(pBuffer, &adi_msd_InquiryReport_1, SCSI_INQUIRY_REPORT_SIZE );
                    *pActualBytesToReturn = SCSI_INQUIRY_REPORT_SIZE;
                
                    bResult = true;
                }
            }
            break;

 

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

Изменено пользователем kolobochishe

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


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

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

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

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

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

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

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

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

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

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