|
как обработать установочный пакет usb |
|
|
|
Feb 10 2009, 16:20
|
Гуру
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923
|
понятно , будем разбирать. Есть простой вопрос наверно по си, не хочется темы размножать с простыми вопросами, напишу здесь. вот объявляем новый тип SetPacked который состоит из 8 байт: Код typedef struct{ BYTE bmReqestType; BYTE bReqest; DWORD wValue; DWORD wIndex; DWORD wLenght; }SetPacked; Вот еще объявляем? что то, как это будет работать не пойму, пример из книги Агурова. Код typedef union{ SetPacked setup; BYTE b[8]; WORD wREqest; }usbSetPacked; объясните если не затруднит.
|
|
|
|
|
Feb 10 2009, 16:33
|
Гуру
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448
|
Цитата(sergey sva @ Feb 10 2009, 19:20) вот объявляем новый тип SetPacked который состоит из 8 байт: А DWORD у Вас - это short? Как-то нестандартно очень. Цитата(sergey sva @ Feb 10 2009, 19:20) Вот еще объявляем? что то, как это будет работать не пойму, пример из книги Агурова. Я бы не стал вообще заморачиваться структурами и юнионами для setup-пакета. Зачем?
|
|
|
|
|
Feb 10 2009, 16:37
|
Гуру
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882
|
Какой-то немного странный union, вы wREqest [4] может быть хотели написать? Но раз так написали, то в памяти переменные будут расположены следующим образом (если принять порядок следования как у "больших индейцев") Код 1-й байт, смещение 0: bmReqestType - b[0] - мл. байт wREqest 2-й байт, смещение 1: bReqest - b[1] - ст. байт wREqest 3-й байт, смещение 2: мл.байт wValue - b[2] - ничего 4-й байт, смещение 3: ст.байт wValue - b[3] - ничего 5-й байт, смещение 4: мл.байт wIndex - b[4] - ничего 6-й байт, смещение 5: ст.байт wIndex - b[5] - ничего 7-й байт, смещение 6: мл.байт wLenght - b[6] - ничего 8-й байт, смещение 7: ст.байт wLenght - b[7] - ничего
|
|
|
|
|
Feb 10 2009, 19:48
|
Гуру
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923
|
Цитата Ну, это пока еще не разборщик smile.gif Будем потихоньку разбираться с этими разборщиками. Вот наваял для разборки запроса от хоста Get_stat_dev, может что тоже нужно подправить, может в обращениях к регистрам что подправить? CODE //------------------------------------------------------------------------------- void end_point_read(DWORD EP, BYTE *dat){ DWORD LenByt, n; /* */ EP &=0x0F; LenByt = (AT91C_BASE_UDP->UDP_CSR[EP] >> 16) & 0x07FF; for (n = 0; n < LenByt; n++) { *dat++ = (BYTE) AT91C_BASE_UDP->UDP_FDR[EP]; }//end for /* */ }//end //------------------------------------------------------------------------------- DWORD end_point_write(DWORD EP, BYTE dat[], DWORD len) { DWORD n; /* */ EP &= 0x0F; /* */ if (AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXPKTRDY) { if ((DualBankEP & (1 << EP)) && (TxDataBank[EP] == 0)) { TxDataBank[EP] = 1; } else { return 0; } }//end if AT91C_UDP_TXPKTRDY
for (n = 0; n < len; n++){ AT91C_BASE_UDP->UDP_FDR[EP] = dat[n]; } AT91C_BASE_UDP->UDP_CSR[EP] |= AT91C_UDP_TXPKTRDY; while(!(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXCOMP)); AT91C_BASE_UDP->UDP_CSR[EP] &= ~AT91C_UDP_TXCOMP; return len; } //------------------------------------------------------------------------------- void Get_stat_dev(DWORD EP){ BYTE OPT[2]; EP &=0x0F; /* */ OPT[0] = (POW_BUS | IGNOR_SIG); OPT[1] = 0; AT91C_BASE_UDP->UDP_CSR[EP] |= AT91C_UDP_DIR;
end_point_write(EP,OPT,2);
while(!(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_RXSETUP)); AT91C_BASE_UDP->UDP_CSR[EP] &= ~AT91C_UDP_RXSETUP; AT91C_BASE_UDP->UDP_CSR[EP] &= ~AT91C_UDP_DIR; }//end void Get_stat_dev(void) //-------------------------------------------------------------------------------
|
|
|
|
|
Feb 10 2009, 20:36
|
Гуру
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448
|
Цитата(sergey sva @ Feb 10 2009, 22:48) Вот наваял для разборки запроса от хоста Get_stat_dev, Логичнее было бы начинать с GET_DESCRIPTOR. Цитата(sergey sva @ Feb 10 2009, 22:48) может что тоже нужно подправить, может в обращениях к регистрам что подправить? Обратите внимание на методику и последовательность установки/снятия битов регистра UDP_CSR в датшите. В частности, DIR нужно ставить до снятия RXSETUP и т.п.
|
|
|
|
|
Feb 11 2009, 19:32
|
Гуру
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923
|
Вот функция которая записывает в конечную точку байты.: CODE //------------------------------------------------------------------------------- DWORD end_point_write(DWORD EP, BYTE dat[], DWORD len) { DWORD n; /* */ EP &= 0x0F; /* */ if (AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXPKTRDY) { if ((DualBankEP & (1 << EP)) && (TxDataBank[EP] == 0)) { TxDataBank[EP] = 1; } else { return 0; } }//end if AT91C_UDP_TXPKTRDY
for (n = 0; n < len; n++){ AT91C_BASE_UDP->UDP_FDR[EP] = dat[n]; } AT91C_BASE_UDP->UDP_CSR[EP] |= AT91C_UDP_TXPKTRDY; while(!(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXCOMP)); AT91C_BASE_UDP->UDP_CSR[EP] &= ~AT91C_UDP_TXCOMP; return len; } //------------------------------------------------------------------------------- сначала здесь записываются в буфер конечной точки байты , после устанавливается флаг окончания записи, далеше в цикле while ожидаю когда хост подтвердит получение байт, установкой флага AT91C_UDP_TXCOMP, а если этого не произойдет, то программа зависнет в этом месте. Как получше это обработать, может еще какие флаги проверять, или таймаут добавить ?
Причина редактирования: Уменьшение видимого размера исходника.
|
|
|
|
|
Feb 11 2009, 20:32
|
Гуру
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448
|
Цитата(sergey sva @ Feb 11 2009, 22:32) Лучше сделать здесь реальную проверку, или не делать вообще. Цитата(sergey sva @ Feb 11 2009, 22:32) А где это сбрасывается? Цитата(sergey sva @ Feb 11 2009, 22:32) Код AT91C_BASE_UDP->UDP_CSR[EP] |= AT91C_UDP_TXPKTRDY; Обратите внимание на Warning в описании UDP_CSR. В данном случае он важен. Цитата(sergey sva @ Feb 11 2009, 22:32) Код while(!(AT91C_BASE_UDP->UDP_CSR[EP] & AT91C_UDP_TXCOMP)); Простым ожиданием TXCOMP убиваются все преимущества двойной буферизации. Совет: не пытайтесь написать универсальные процедуры обслуживания конечных точек - ничего, кроме лишнего геморроя, это не принесет.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|