Jump to content

    
Sign in to follow this  
ДЕЙЛ

Отправка пакета через USB из LPC1778 в ПК

Recommended Posts

Приятно удивило, что там добрая сотня файлов, в которых мне копаться неделю надо. Пока хочу с простейшего начать.

Сказать что Вы сильно преувеличиваете - значит ничего не сказать.

Открываем IAR6.50 - там в USB-ядре всего 3 файла: usb_buffer.c, usb_hw.c, usb_t9.c

Вам нужен: EWARM 6.50.3\arm\examples\NXP\LPC17xx\IAR-LPC-1788-SK\AudioDevice\modules\usb_hw.c

ISR в нём: USB_IRQHandler() - вот в нём и разбирайтесь.

На поиск у меня ушло 2 минуты...

 

Далее - сниферы ничего не "ждут". Они фиксируют шинный трафик и отображают его в более менее понятном виде.

Маленькая поправочка: снифферы не "фиксируют шинный трафик", они "фиксируют вызовы API к USB-драйверу ядра".

Share this post


Link to post
Share on other sites
Понапридумывают же... sm.gif Попробую ещё раз перечитать про USB, мошть понятнее станет.

Есть такая книжка: Агуров, Интерфейс USB.Практика использования и программирования. 2004

Там по-русски и вполне понятно для начинающего объяснено про устройство USB

Share this post


Link to post
Share on other sites

Вот картинка из Агурова. Правильно я понимаю, что байты команд хоста во время инициализации можно увидеть в буфере нулевой конечной точки? Или они невидимы для программиста со стороны контроллера?

post-79085-1424335558_thumb.jpg

Share this post


Link to post
Share on other sites

Опять вернулся к этой теме. Почитал Агурова и описание модуля. В моём представлении вырисовывается такая картина:

1. Подключаем разъём к ноуту, хост видит, что резистор притянул линию и отсылает запрос;

2. Устройство принимает байты запроса в буфер нулевой конечной точки, смотрит эти байты и формирует массив данных, которые хостом воспринимаются как дескриптор устройства;

3. На основании данных дескриптора хост отправляет более конкретную команду устройству и т.д. до окончания инициализации соединения.

Мои соображения похожи на правду?

Share this post


Link to post
Share on other sites
Опять вернулся к этой теме. Почитал Агурова и описание модуля. В моём представлении вырисовывается такая картина:

1. Подключаем разъём к ноуту, хост видит, что резистор притянул линию и отсылает запрос;

2. Устройство принимает байты запроса в буфер нулевой конечной точки, смотрит эти байты и формирует массив данных, которые хостом воспринимаются как дескриптор устройства;

3. На основании данных дескриптора хост отправляет более конкретную команду устройству и т.д. до окончания инициализации соединения.

Мои соображения похожи на правду?

в общем да

каждый запрос имеет свой идентификатор и, соответственно, структуру себя родимого и ответа

делается все в switch-case для каждого типа запроса. Если что-то не реализовано, отрабатывается STALL

смотреть во всех кейловских примерах (в яре, по-моему, то же самое было), файл usbcore.c, функция USB_EndPoint0

примерно так:

void USB_EndPoint0 (U32 event) {

 switch (event) {
case USB_EVT_SETUP:
  USB_SetupStage();
  USB_DirCtrlEP(SetupPacket.bmRequestType.BM.Dir);
  EP0Data.Count = SetupPacket.wLength;	 /* Number of bytes to transfer */

  switch (SetupPacket.bmRequestType.BM.Type) {

	case REQUEST_STANDARD:
	  switch (SetupPacket.bRequest) {

		case USB_REQUEST_GET_STATUS:
		  if (!USB_ReqGetStatus()) {
			goto stall_i;
		  }
		  USB_DataInStage();
		  break;

		case USB_REQUEST_CLEAR_FEATURE:
		  if (!USB_ReqSetClrFeature(0)) {
			goto stall_i;
		  }
		  USB_StatusInStage();
		  break;

		case USB_REQUEST_SET_FEATURE:
		  if (!USB_ReqSetClrFeature(1)) {
			goto stall_i;
		  }
		  USB_StatusInStage();
		  break;

		case USB_REQUEST_SET_ADDRESS:
		  if (!USB_ReqSetAddress()) {
			goto stall_i;
		  }
		  USB_StatusInStage();
		  break;

		case USB_REQUEST_GET_DESCRIPTOR:
		  if (!USB_ReqGetDescriptor()) {
			goto stall_i;
		  }
		  USB_DataInStage();
		  break;

		case USB_REQUEST_SET_DESCRIPTOR:
/*stall_o:*/  USB_SetStallEP(0x00);			/* not supported */
		  EP0Data.Count = 0;
		  break;

		case USB_REQUEST_GET_CONFIGURATION:
		  if (!USB_ReqGetConfiguration()) {
			goto stall_i;
		  }
		  USB_DataInStage();
		  break;

		case USB_REQUEST_SET_CONFIGURATION:
		  if (!USB_ReqSetConfiguration()) {
			goto stall_i;
		  }
		  USB_StatusInStage();
		  break;

...... и так далее

 

сама функция дергается из USB-прерывания (usbhw.c)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this