USB устройство за съхранение на данни и libopencm3


Работата ми е свързана с програмирането на микроконтролери, по-специално STM32. За дълго време за работа с периферни устройства Използвах STM32 Standard Периферна библиотека, както е предвидено от производителя, и, съответно, това е най-пълна. Въпреки това, работата с нея е изключително неудобно: инициализация структури често са прекомерни, във функциите на дявола счупи крак, като цяло, много скоро, не е непреодолимо желание да стигнем до библиотеката и да преминете към нещо по-точно, добре проектирани и писано в "чист код".

След дълго търсене, е установено, библиотека отворен код libopencm3, което отговаря на всички изисквания. Отзиви за работата й са положителни, и се оказа най-приятен за нея.

Една от последните задачи по време на работа е да се повиши USB MSD. За да се реши този проблем се използва за отстраняване на грешки борда STM32F4-откритие, а това един пример. ПРИМЕР не успее да стартира. Имаше два проблема:
1. Невъзможно е да отидете на диска и да прочетете файла намира там.
2. Устройство за откриване като диск е повече от 2 минути.

Всичко това се дължи на наличието на някои грешки в usb_msc.c файл. По този начин, в тази статия ще говорим за това как да ги поправите, и ще продължи да бъде щастлив да се използва библиотека libopencm3.

Решаването №1:
Грешка Долната линия е, че когато устройството получи заявка за записване, тя се справя правилно, но не изпрати обратно статус CSW за обработка на искането (Command статута обвивка). По този начин, USB хост (в този случай, това е нашата PC) отива в безкраен чака отговор на искането, всички зависвания аварийно спиране на ядрото, умират, докато устройството за прекъсване на връзката =)

* Повече информация за съхранение на данни само за големи или CBI Транспорт спецификация тук.

Ето защо, ние откриваме msc_data_rx_cb функция usb_msc.c файл и да го дам на следния вид:

Добавената част от кода е между наклонени черти

Ура, сега можем да отидем на диска, за да прочетете файла!

Решаването №2:
Същността на проблема е, че не всички един и същи файл usb_msc.s две SCSI команди се изпълняват. Това бе разкрито от много полезно програма usblyser. което позволява удобен начин да видите на обмена на парцели между USB устройството и USB хост.

Така че, от една страна, приемащата не получава отговор на командните READ_FORMAT_CAPACITIES на. Ето защо, добавяйки файл usb_msc.s функционални scsi_read_format_capacities и да даде scsi_command функция от следния вид:

На второ място, домакин не получава отговор на командата ЗАПИТВАНЕ (пореден номер). За да поправи тази грешка, трябва да се създаде _spc3_inquiry_sn_response масив и олово функция scsi_inquiry следния вид:

* За повече подробности относно CO SCSI команди могат да бъдат отново тук.

След всички тези операции трябва да възстанови на библиотеката, преди да се направи чиста команда.

В близко бъдеще смятам да се направи заявка за дърпане на libopencm3 на хранилище, обаче, може само да гадаем колко скоро собствениците ще да направят промените в библиотеката и работа в същото време всички ние се нуждаем тук и сега.

Послепис Тук се крие нашата корпоративна вилица библиотека вече изменя, ако е мързелив да се копае.

Аз не знам как миди, но се опитваме да направим чрез stm32cube CDC виртуален порт на компютъра, всички vrodeby добро, и постигна скоростта, и да изпраща и получава ... но когато на рецепцията отива независимо от предаването (режим е заявка-отговор, а режимът ние изпращаме данни сами, ще получим данните и други, ние изпращат и получават независимо). Тогава USB ще спре - никаква представа, че прекъсват се получават данни от устройството домакин. Аз все още се опитваше да направи бодикит и трупи в RAM всички libu, и се вгледа в нея нагоре и надолу, и провери регистъра на състоянието и пренаписаха функцията на бог, който решава да прекъсва. tchetno всички - устройство просто zastoparivaetsya, престава да изляза и приемане и предаване. Нещо повече, това е ясно за грешка на ползване ниво хардуер USB контролер на STM32F4 ниска.

Проектът е победа или Linux?

една победа, но и се движат по Linux.

Тогава аз питам minigayd tulcheyna настройка :)

Аз работя в Eclipse. Ето един сайт GNU ARM Eclipse. всичко е супер подробно в раздел Inslall: как да инсталирате GNU ARM Eclipse плъгин, как да се коригира toolchain и дебъгер как да вземете =)

HID MSD - Смея да твърдя - дебъгер mbed?
и в HID MSD В CDC не мисли?

Не, не позна), това е все още корпоративна тайна, но след месец-два мога да пиша за нашето развитие!

Ако не се лъжа на «Стандарт Периферна Библиотека» производителя се счита за остаряла и настоятелно препоръчва използването на куб вместо.

Да, така е. Въпреки това, винаги има проблеми, когато трябва да се знае, че наистина функция, която регистрира и докосвания. .. и т.н., и в усуква куб твърде масивна HAL и да слезе в ада (ниска шофьор ниво), трябва да се отвори един милион файлове, объркани и да забравите защо сте там достигна) Като цяло, само HAL Когото уповавам - един HAL ChibiOS. Но всичко това е друга история)

Анастасия, благодаря ти за статията. Би било много интересно да се прочете за предизвикателствата, с които се сблъсквате в работата си и да решите кои инструменти, литература и т.н. В същото време, който използвате, прочетете ли някакви професионални онлайн ресурси по този въпрос, и така нататък. Попаднах на много малко информация по темата в публичното пространство. Напиши повече!

Сетих се за това, което ще трябва да се приложи на интерфейса на устройството, както и / Proc и / сис в Linux с помощта на MSC. Това е възможно да се актуализира фърмуера за контрол на различни флагове. До това се прави чрез доставчик на устройства и Libusb в тяхната полезност. Но Cypress FX3 го направи дръжки имат напълно, въпреки че има абстракция USB, така че разумно. Страхувам се обаче, че докато тя не се разпределя, а паметта е не достатъчно, за да се закълна. Вярно е помощна програма ще бъде много опростена, като домакин.

Времето, посочено в часовата зона, която е монтирана в устройството.