реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> как обработать установочный пакет usb
sergey sva
сообщение Feb 10 2009, 14:30
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Разбираюсь с работой усб немного не понятно,с пакетами,
к примеру: программа приступила к обработки прерывания, определила какая конечная точка вызвала это прерывание,
определила, что поступил установочный пакет if (save_reg_csrX & AT91C_UDP_RXSETUP) {
какие действия нужно проделать дальше что бы обработать этот пакет? Или для at91sam7 его не надо обрабатывать?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 14:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sergey sva @ Feb 10 2009, 17:30) *
какие действия нужно проделать дальше что бы обработать этот пакет?

Дальше нужно узнать, что от нас хочет хост, т.е. разобрать пакет в соответствии с разделом 9 (USB Device Framework) спецификации USB.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 10 2009, 16:20
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



понятно , будем разбирать. smile.gif
Есть простой вопрос наверно по си, не хочется темы размножать с простыми вопросами, напишу здесь.
вот объявляем новый тип 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;

объясните если не затруднит.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 16:33
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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-пакета. Зачем?
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 10 2009, 16:37
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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] - ничего
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 10 2009, 16:43
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
А DWORD у Вас - это short? Как-то нестандартно очень.

Опечатка вышла WORD там должен быть, unsigned short.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 16:44
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(rezident @ Feb 10 2009, 19:37) *
если принять порядок следования как у "больших индейцев"

А написано для little. Вот поэтому лучше работать с байтами, тем более, что их всего восемь, а поля в setup-пакете не меняются.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 10 2009, 17:20
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Вот набросал не большой разборщик установочного пакета, может что здесь нужно подправить ?
CODE

//-------------------------------------------------------------------------------
void PROCES_SETUP_PACKET(DWORD EP){
DWORD LenByt, n;
BYTE SetPacket[8];
WORD bReqest;
/* */
EP &=0x0F;
/* */
LenByt = (AT91C_BASE_UDP->UDP_CSR[EP] >> 16) & 0x07FF;
for (n = 0; (n < LenByt && n < 8); n++) {
SetPacket[n] = (BYTE) AT91C_BASE_UDP->UDP_FDR[EP];
}//end for
/* */
bReqest = SetPacket[0] & 0xFF ;
bReqest = (bReqest<<8) | (SetPacket[1] & 0xFF);
/* */
switch(bReqest){
case GET_STATUS_DEVICE:

break;
case GET_STATUS_INTERF:

break;
case GET_STATUS_ENDPNT:

break;
case GET_DESCRIPTOR_DEVICE:
case GET_DESCRIPTOR_INTERF:
case GET_DESCRIPTOR_ENDPNT:

break;
case GET_CONFIGURATION:

break;
case SET_CONFIGURATION:

break;
case SET_ADDRESS:

break;

default :

break;
}//end switch

}//end PROCES_SETUP_PACKET
//-------------------------------------------------------------------------------

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 17:28
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Ну, это пока еще не разборщик smile.gif

Не вижу смысла объединять поля bmRequestType и bRequest в одной переменной - будет весьма неудобно работать.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 10 2009, 19:48
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
Ну, это пока еще не разборщик smile.gif

Будем потихоньку разбираться с этими разборщиками. 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)
//-------------------------------------------------------------------------------

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 20:36
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 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 и т.п.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 11 2009, 14:14
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



исправил. Еще есть вопрос читаю по ходу книгу агурова, есть не ясность не большая, на картинке.
Прикрепленное изображение

там функция getstatendpoint в ней объявляется переменная wIndex для чего она здесь?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 11 2009, 14:18
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sergey sva @ Feb 11 2009, 17:14) *
для чего она здесь?

Наверное, осталась от copy-paste. Компилятор должен выдать ворнинг.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Feb 11 2009, 19:32
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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,
а если этого не произойдет, то программа зависнет в этом месте.
Как получше это обработать, может еще какие флаги проверять, или таймаут добавить ?
Причина редактирования: Уменьшение видимого размера исходника.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 11 2009, 20:32
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(sergey sva @ Feb 11 2009, 22:32) *
Код
  EP &= 0x0F;

Лучше сделать здесь реальную проверку, или не делать вообще.

Цитата(sergey sva @ Feb 11 2009, 22:32) *
Код
  TxDataBank[EP] = 1;

А где это сбрасывается?

Цитата(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 убиваются все преимущества двойной буферизации.


Совет: не пытайтесь написать универсальные процедуры обслуживания конечных точек -
ничего, кроме лишнего геморроя, это не принесет.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th May 2024 - 07:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016