Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB Bulk firmware
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
V_l_a_d
Всем привет.

При разборе возник один вопросик в данной части кода (tn_user.c - tn_usb_int_func):
Код
...
if(rUSBDevIntSt & EP_SLOW)     //-- Endpoints
   {
      ep_int_status = rUSBEpIntSt;

      //-- EP0 - Control
      if(ep_int_status & 1)
         tn_usb_EP0_rx_int_func(&gUSBInfo); //-- OUT
      else if(ep_int_status & (1<<1))
         tn_usb_EP0_tx_int_func(&gUSBInfo); //-- IN

      //-- EP2 - Bulk
      if(ep_int_status & (1<<EP2_RX))
         tn_usb_ep_rx_int(&gEP2RX_EI); //-- OUT
      if(ep_int_status & (1<<EP2_TX))
         tn_usb_ep_tx_int(&gEP2TX_EI); //-- IN
      //-- EP5 - Bulk
      if(ep_int_status & (1<<EP5_RX))
         tn_usb_ep_rx_int(&gEP5RX_EI); //-- OUT
      if(ep_int_status & (1<<EP5_TX))
        tn_usb_ep_tx_int(&gEP5TX_EI); //-- IN

      rUSBDevIntClr = EP_SLOW; // clear EP_SLOW
   }
...


А какой смысл запихивать вот это
Код
if(ep_int_status & (1<<EP2_TX))
         tn_usb_ep_tx_int(&gEP2TX_EI);

и это
Код
if(ep_int_status & (1<<EP5_TX))
        tn_usb_ep_tx_int(&gEP5TX_EI);

в этот обработчик прерываний?
V_l_a_d
Надеюсь, что кто-то всё таки ответит. Конкретизирую вопрос.

На сколько я понял tn_usb_int_func это единственное место, откуда данные могут быть отправлены хосту. Их отправкой занимается tn_usb_ep_tx_int(EP_INFO * ei), но вызов этой функции произойдет, только в том случае, если (ep_int_status & (1<<EP2_TX)) != 0, т.е. 5 бит регистра USBEpIntSt будет установлен в "1", но это возможно только в том случае, если какие то данные с этой конечной точки уже отправлены. А поскольку tn_usb_ep_tx_int вызывается только в обработчике прерывание от USB, то пу сути получается замкнутый круг и данные никогда не отправятся хосту.

Однако в реале прошивка отлично работает -> чего-то непонимаю я. Может кто-нибудь ткнуть пальцем: где всё таки инициируется отправка данных хосту?

Заранее спасибо.
r_dot
Цитата(V_l_a_d @ Sep 16 2007, 14:27) *
... где всё-таки инициируется отправка данных хосту?


Нигде. Инициировать отправку данных нельзя. Хост сам их запрашивает и забирает, если они есть (подготовлены в буфере). То есть, данные для чтения надо заранее подготовить в буфере и снять NAK. Хост забирает их сам в произвольный момент времени (речь о BULK) и ставит NAK. После этого и генерируется прерывание, что данные забраны и можно заполнять буфер очередной порцией.
В начале работы программы надо не забыть правильно инициировать буфер, чтобы исключить неправильное (пустое) первое чтение.
V_l_a_d
Цитата(r_dot @ Sep 16 2007, 18:10) *
Нигде. Инициировать отправку данных нельзя. Хост сам их запрашивает и забирает, если они есть (подготовлены в буфере). То есть, данные для чтения надо заранее подготовить в буфере и снять NAK. Хост забирает их сам в произвольный момент времени (речь о BULK) и ставит NAK. После этого и генерируется прерывание, что данные забраны и можно заполнять буфер очередной порцией.
В начале работы программы надо не забыть правильно инициировать буфер, чтобы исключить неправильное (пустое) первое чтение.


Спасибо. Уже понял абсурдность своего вопроса, читая Агурова.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.