kuzulis 0 18 октября, 2019 Опубликовано 18 октября, 2019 · Жалоба Всем привет. Кто-нибудь работал с чипом CY7C68013A (FX2) в связке с IAR EW? Суть в том, что я делаю (по приколу) USB HID Game Pads эмулятор для 10-ти кнопочных джойстиков для NES (от старых добрых 8-битных дендей). Там уже все работает при использовании компиляторов KEIL C51 и SDCC. Но вот, с IAR какая то засада: ОС не может проенумеровать USB дескрипторы устройства. Например, при попытке получить «Device Descriptor», ОС получает какой то мусор: все поля заполнены нулями (вместо содержимого этого дескриптора). Я уже вырвал на себе все волосы, но так и не понял что за ерунда. Может сталкивался кто или знает кого-то кто сталкивался с IAR && FX2 чипом? PS: Гугл не выдает ни одного упоминания о связке IAR && FX2 (CY7C68013A) как я ни искал.. Похоже никто вообще этого не делал в природе, что ли.. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 18 октября, 2019 Опубликовано 18 октября, 2019 · Жалоба Что означает "в связке" ? В качестве чего ? Побайтно сравните содержимое таблицы где прописаны данные по VID-PID итд, для работающей (Keil) и неработающей (IAR) прошивок (область бинарного образа памяти контроллера), физ. адрес что и где - смотреть в map-файле линкера. Если речь идет о программировании FW HIDa в CY7C68013 = контроллер с системой команд MCS51 + 8/16-разрядное параллельное fifo (это я на всякий случай ). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuzulis 0 21 октября, 2019 Опубликовано 21 октября, 2019 · Жалоба > то означает "в связке" ? В качестве чего ? означает, что использовать компилятор от IAR 8051. > Побайтно сравните содержимое таблицы где прописаны данные по VID-PID там какая-то хрень с обработкой ф-ции: static BOOL ep0_std_descriptor_proc(void) { BYTE XDATA *pdesc = (BYTE XDATA *)hid_ep0_std_desc_get(); if (pdesc) { SUDPTRH = usb_word_msb_get(pdesc); SUDPTRL = usb_word_lsb_get(pdesc); return TRUE; } return FALSE; } Суть в том, что этот чип имеет некую хардварную фичу, которая упрощает энумерацию USB у-ва. Т.е. не нужно передавать а ЕР0 размер запрашиваемого USB дескриптора, а достаточно только передать в регистры SUDPTRH и SUDPTRL адрес где этот дескриптор начинается, и чип сам передаст его хосту. Я отлаживая светодиодиком вижу, что код заходит сюда, но почему-то хост принимает "пустой" дескриптор... Цитата ===>Device Descriptor<=== *!*ERROR: bLength of 0 incorrect, should be 18 bLength: 0x00 bDescriptorType: 0x00 bcdUSB: 0x0000 bDeviceClass: 0x00 *!*ERROR: Device enumeration failure Я пробовал менять реализацию макросов usb_word_{msb|lsb}_get() (типа менять big-endian/little/endian).. Но результат тот же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kuzulis 0 21 октября, 2019 Опубликовано 21 октября, 2019 (изменено) · Жалоба Заработало! Почему-то надо дефайнить структуры дескрипторов в xdata области памяти, а не в code.. Я хз почему с иаром так. Изменено 21 октября, 2019 пользователем kuzulis Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 21 октября, 2019 Опубликовано 21 октября, 2019 · Жалоба непонятно. Из примеров для Keil (ASM модуль). В возможно в конфигурации какой-то бит в нетом состоянии и рояль не заиграл. Было бы неплохо проверить что пишется в pdesc при инициализации. ;;----------------------------------------------------------------------------- ;; File: dscr.a51 ;; Contents: This file contains descriptor data tables. ;; ;; $Archive: /USB/Examples/FX2LP/hid_kb/dscr.a51 $ ;; $Date: 5/27/04 1:25p $ ;; $Revision: 2 $ ;; ;; ;;----------------------------------------------------------------------------- ;; Copyright 2003, Cypress Semiconductor Corporation ;;----------------------------------------------------------------------------- ;;----------------------------------------------------------------------------- DSCR_DEVICE equ 1 ;; Descriptor type: Device DSCR_CONFIG equ 2 ;; Descriptor type: Configuration DSCR_STRING equ 3 ;; Descriptor type: String DSCR_INTRFC equ 4 ;; Descriptor type: Interface DSCR_ENDPNT equ 5 ;; Descriptor type: Endpoint DSCR_DEVQUAL equ 6 ;; Descriptor type: Device Qualifier DSCR_DEVICE_LEN equ 18 DSCR_CONFIG_LEN equ 9 DSCR_INTRFC_LEN equ 9 DSCR_ENDPNT_LEN equ 7 DSCR_DEVQUAL_LEN equ 10 ET_CONTROL equ 0 ;; Endpoint type: Control ET_ISO equ 1 ;; Endpoint type: Isochronous ET_BULK equ 2 ;; Endpoint type: Bulk ET_INT equ 3 ;; Endpoint type: Interrupt public DeviceDscr, DeviceQualDscr, HighSpeedConfigDscr, FullSpeedConfigDscr, StringDscr, UserDscr, HIDDscr public HIDReportDscr, HIDReportDscrEnd DSCR SEGMENT CODE PAGE ;;----------------------------------------------------------------------------- ;; Global Variables ;;----------------------------------------------------------------------------- rseg DSCR ;; locate the descriptor table in on-part memory. DeviceDscr: db DSCR_DEVICE_LEN ;; Descriptor length db DSCR_DEVICE ;; Decriptor type dw 0002H ;; Specification Version (BCD) db 00H ;; Device class db 00H ;; Device sub-class db 00H ;; Device sub-sub-class db 64 ;; Maximum packet size dw 0B404H ;; Vendor ID dw 0510H ;; Product ID (Sample Device) dw 0000H ;; Product version ID db 1 ;; Manufacturer string index db 2 ;; Product string index db 0 ;; Serial number string index db 1 ;; Number of configurations DeviceQualDscr: db DSCR_DEVQUAL_LEN ;; Descriptor length db DSCR_DEVQUAL ;; Decriptor type dw 0002H ;; Specification Version (BCD) db 00H ;; Device class db 00H ;; Device sub-class db 00H ;; Device sub-sub-class db 64 ;; Maximum packet size db 1 ;; Number of configurations db 0 ;; Reserved HighSpeedConfigDscr: db DSCR_CONFIG_LEN ;; Descriptor length db DSCR_CONFIG ;; Descriptor type db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) mod 256 ;; Total Length (LSB) db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) / 256 ;; Total Length (MSB) db 1 ;; Number of interfaces db 1 ;; Configuration number db 0 ;; Configuration string db 10100000b ;; Attributes (b7 - buspwr, b6 - selfpwr, b5 - rwu) db 50 ;; Power requirement (div 2 ma) ;; Interface Descriptor db DSCR_INTRFC_LEN ;; Descriptor length db DSCR_INTRFC ;; Descriptor type db 0 ;; Zero-based index of this interface db 0 ;; Alternate setting db 2 ;; Number of end points db 03H ;; Interface class db 00H ;; Interface sub class db 00H ;; Interface sub sub class db 0 ;; Interface descriptor string index HIDDscr: db 09h ; length db 21h ; type: HID db 010h,01h ; release: HID class rev 1.1 db 00h ; country code (none) db 01h ; number of HID class descriptors to follow db 22h ; report descriptor type (HID) db (HIDReportDscrEnd - HIDReportDscr) ; length of HID descriptor db 00h HIDDscrEnd: ;; Endpoint Descriptor db DSCR_ENDPNT_LEN ;; Descriptor length db DSCR_ENDPNT ;; Descriptor type db 81H ;; Endpoint number, and direction db ET_INT ;; Endpoint type db 40H ;; Maximun packet size (LSB) db 00H ;; Max packect size (MSB) db 0AH ;; Polling interval ;; Endpoint Descriptor db DSCR_ENDPNT_LEN ;; Descriptor length db DSCR_ENDPNT ;; Descriptor type db 01H ;; Endpoint number, and direction db ET_INT ;; Endpoint type db 40H ;; Maximun packet size (LSB) db 00H ;; Max packect size (MSB) db 0AH ;; Polling interval HighSpeedConfigDscrEnd: db 00h ;; pad FullSpeedConfigDscr: db DSCR_CONFIG_LEN ;; Descriptor length db DSCR_CONFIG ;; Descriptor type db (FullSpeedConfigDscrEnd-FullSpeedConfigDscr) mod 256 ;; Total Length (LSB) db (FullSpeedConfigDscrEnd-FullSpeedConfigDscr) / 256 ;; Total Length (MSB) db 1 ;; Number of interfaces db 1 ;; Configuration number db 0 ;; Configuration string db 10100000b ;; Attributes (b7 - buspwr, b6 - selfpwr, b5 - rwu) db 50 ;; Power requirement (div 2 ma) ;; Interface Descriptor db DSCR_INTRFC_LEN ;; Descriptor length db DSCR_INTRFC ;; Descriptor type db 0 ;; Zero-based index of this interface db 0 ;; Alternate setting db 2 ;; Number of end points db 03H ;; Interface class db 00H ;; Interface sub class db 00H ;; Interface sub sub class db 0 ;; Interface descriptor string index ;; HID Descriptor db 09h ; length db 21h ; type: HID db 010h,01h ; release: HID class rev 1.1 db 00h ; country code (none) db 01h ; number of HID class descriptors to follow db 22h ; report descriptor type (HID) db (HIDReportDscrEnd - HIDReportDscr) ; length of HID descriptor db 00h ;; Endpoint Descriptor db DSCR_ENDPNT_LEN ;; Descriptor length db DSCR_ENDPNT ;; Descriptor type db 81H ;; Endpoint number, and direction db ET_INT ;; Endpoint type db 40H ;; Maximun packet size (LSB) db 00H ;; Max packect size (MSB) db 0AH ;; Polling interval ;; Endpoint Descriptor db DSCR_ENDPNT_LEN ;; Descriptor length db DSCR_ENDPNT ;; Descriptor type db 01H ;; Endpoint number, and direction db ET_INT ;; Endpoint type db 40H ;; Maximun packet size (LSB) db 00H ;; Max packect size (MSB) db 0AH ;; Polling interval FullSpeedConfigDscrEnd: db 00h ;; pad StringDscr: StringDscr0: db StringDscr0End-StringDscr0 ;; String descriptor length db DSCR_STRING db 09H,04H StringDscr0End: StringDscr1: db StringDscr1End-StringDscr1 ;; String descriptor length db DSCR_STRING db 'C',00 db 'y',00 db 'p',00 db 'r',00 db 'e',00 db 's',00 db 's',00 StringDscr1End: StringDscr2: db StringDscr2End-StringDscr2 ;; Descriptor length db DSCR_STRING db 'E',00 db 'Z',00 db '-',00 db 'U',00 db 'S',00 db 'B',00 StringDscr2End: HIDReportDscr: db 05h, 01h ; Usage Page (Generic Desktop) db 09h, 06h ; Usage (Keyboard) db 0A1h, 01h ; Collection (Application) db 05h, 07h ; Usage Page (Key codes) db 19h, 0E0h ; Usage minimum (234) db 29h, 0E7h ; Usage maximum (231) db 15h, 00h ; Logical minimum (0) db 25h, 01h ; Logical maximum (1) db 75h, 01h ; Report size (1) db 95h, 08h ; Report count (8) db 81h, 02h ; Input (data, variable, absolute) db 95h, 01h ; Report count (1) db 75h, 08h ; Report size (8) db 81h, 01h ; Input (constant) db 95h, 05h ; Report count (5) db 75h, 01h ; Report size (1) db 05h, 08h ; Usage Page (LED) db 19h, 01h ; Usage minimum (1) db 29h, 05h ; Usage maximum (5) db 91h, 02h ; Output (data, variable, absolute) db 95h, 01h ; Report count (1) db 75h, 03h ; Report size (3) db 91h, 01h ; Output (constant) db 95h, 03h ; Report count (3) db 75h, 08h ; Report size (8) db 15h, 00h ; Logical minimum (0) db 25h, 65h ; Logical maximum (101) db 05h, 07h ; Usage page (key codes) db 19h, 00h ; Usage minimum (0) db 29h, 65h ; Usage maximum (101) db 81h, 00h ; Input (data, array) db 0C0h ; End Collection HIDReportDscrEnd: UserDscr: dw 0000H end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться