Цитата(Георгий @ Feb 15 2007, 12:05)

У меня тоже не получилось. мне кажется, что хотя и декларировано помещение на любую 0 (или 7 ) ножку, но код жестко привязан к 0.
Код
#define USB_CFG_IOPORT PORTD
#define USB_CFG_DMINUS_BIT PD0
#define USB_CFG_DPLUS_BIT PD2
Вот это всё полная чушь. смотрим далее
usbdrv.h
Код
/* I/O definitions for assembler module */
#define USBOUT USB_CFG_IOPORT /* output port for USB bits */
#define USB_PULLUP_OUT USB_CFG_PULLUP_IOPORT
#ifdef __ASSEMBLER__
/* the following two lines must start in column 0 for IAR assembler */
USBIN = (USB_CFG_IOPORT - 2) /* input port for USB bits */
USBDDR = (USB_CFG_IOPORT - 1) /* data direction for USB bits */
#else
#define USBIN (*(&USB_CFG_IOPORT - 2)) /* input port for USB bits */
#define USBDDR (*(&USB_CFG_IOPORT - 1)) /* data direction for USB bits */
#define USB_PULLUP_DDR (*(&USB_CFG_PULLUP_IOPORT - 1))
#endif
#if USB_CFG_DMINUS_BIT != PD0
# error "USB_CFG_DMINUS_BIT MUST be PD0!"
#endif
#define USBMINUS USB_CFG_DMINUS_BIT /* D- MUST be on bit 0 */
#define USBIDLE 0x01 /* value representing J state */
#define USBMASK ((1<<USB_CFG_DPLUS_BIT) | USBIDLE) /* mask for USB I/O bits */
Видно, что USBIDLE никак не соотносится с объявлением выше. Ну ладно меняем его на
Код
#define USBIDLE (1<<USB_CFG_DMINUS_BIT)
и убираем нафиг проверку на PD0 несколькими строками выше.
По идее всё. Но кто гарантирует что такого нет прям в коде? В смысле что в коде 100% идёт ссылка на эти объявления. И кстати как к таким дефайнам относится АСМ?
Код
cbr x1, USBMASK ;1 mask out data bits
ori x1, USBIDLE ;1 idle
Фактически код выше выглядит как:
Код
cbr x1, ((1<<USB_CFG_DPLUS_BIT) | (1<<USB_CFG_DMINUS_BIT)) ;1 mask out data bits
ori x1, (1<<USB_CFG_DMINUS_BIT) ;1 idle
Мне кажеться это не есть правильно... Но на удивление это собирается. Но не работает. Не работает если D- != PD0.