Перейти к содержанию
    

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

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

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

Открываем 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-драйверу ядра".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

для чего в описании USB фигурирует I2C? В общих чертах хотелось бы узнать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

post-79085-1424335558_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...