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

RNDIS и CY7C68013A c FPGA

Назрел вопрос следующего рода:

 

Имеется FPGA c подключенной к ней CY7C68013A, на эту FPGA приходят MII пакеты (Ethernet). С CY7C68013A реализован двухсторонний обмен данными. Могу записать в USB пакетик и считать могу данные из него. работает в CyConsole. режим bulk и slave fifo и два Endpoint'а под это выделены.

 

Хотелось бы реализовать по сути сетевой интерфейс USB (с IP адресом, шлюзом, ну вообще, как обычная сетевая USB карточка) и пакеты Ethernet принимать и отправлять из FPGA в комп.

 

Прочитал, что есть такая штука - RNDIS. И она как раз позволяет реализовывать Сетевые интерфейсы на USB.

 

Кто может что сказать по реализации драйвера сетевого устройства RNDIS ? Может есть у кого какие Examples ? Поделитесь, плиз. Спасибо.

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


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

Назрел вопрос следующего рода:

 

Имеется FPGA c подключенной к ней CY7C68013A, на эту FPGA приходят MII пакеты (Ethernet). С CY7C68013A реализован двухсторонний обмен данными. Могу записать в USB пакетик и считать могу данные из него. работает в CyConsole. режим bulk и slave fifo и два Endpoint'а под это выделены.

 

Хотелось бы реализовать по сути сетевой интерфейс USB (с IP адресом, шлюзом, ну вообще, как обычная сетевая USB карточка) и пакеты Ethernet принимать и отправлять из FPGA в комп.

 

Прочитал, что есть такая штука - RNDIS. И она как раз позволяет реализовывать Сетевые интерфейсы на USB.

 

Кто может что сказать по реализации драйвера сетевого устройства RNDIS ? Может есть у кого какие Examples ? Поделитесь, плиз. Спасибо.

RNDIS - Фактически туннель через USB для Ethernet фрэймов. Смотреть лучше в исходниках Linux (usb gadget). Кода там на тысячу/другую строк.

"IP, шлюз, ..." - не важно. RNDIS этим не занимается.

Понадобится один "bulk" и один "interrupt" endpoint.

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


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

Спасибо за ваш комментарий!

 

Понадобится один "bulk" и один "interrupt" endpoint.

Странно, я думал еще control нужно.... bulk я так понимаю это на передачу в FPGA, а interrupt - на прием из устройства?

а формат данных принимаемых/передаваемых нигде не описан (кроме как в этом rndisspc.doc файле из MS RNDIS USB kit 2005) ?

 

дело в том, что хотелось бы устройство кросплатформенным сделать...

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


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

Спасибо за ваш комментарий!

 

 

Странно, я думал еще control нужно.... bulk я так понимаю это на передачу в FPGA, а interrupt - на прием из устройства?

а формат данных принимаемых/передаваемых нигде не описан (кроме как в этом rndisspc.doc файле из MS RNDIS USB kit 2005) ?

 

дело в том, что хотелось бы устройство кросплатформенным сделать...

"control", конечно, нужен. 'bulk' используется для передачи данных, 'interrupt' - для сообщения винде, что команда была выполнена.

По сути, просто необходимо принимать команды (включить/выключить/запрос статистики/...) и положить четыре байта (или восемь - не помню)

в 'interrupt' endpoint. Только после этого винда запросит результат команды.

Пакеты(Ethernet frame) передаются с заголовком REMOTE_NDIS_PACKET_MSG, где надо все установить в нули,

кроме след.:

MessageType = REMOTE_NDIS_PACKET_MSG

MessageLength = 44 + size

DataOffset = 36

DataLength = size

------

Реализовать надо след. команды:

REMOTE_NDIS_INITIALIZE_MSG

REMOTE_NDIS_HALT_MSG

REMOTE_NDIS_QUERY_MSG

REMOTE_NDIS_SET_MSG

REMOTE_NDIS_RESET_MSG

REMOTE_NDIS_KEEPALIVE_MSG

------

Для REMOTE_NDIS_SET_MSG надо поддерживать 'OID_GEN_CURRENT_PACKET_FILTER', 'OID_802_3_MULTICAST_LIST'

Можно просто вернуть статус 'OK', и ничего не делать.

Читаем здесь и здесь

 

Да, добавлю.

Команды (REMOTE_NDIS_INITIALIZE_MSG, ...) идут через 'control' endpoint, где (для Setup):

'bRequest' = ('type' = 'CLASS', 'recipient' = 'INTERFACE')

'bmRequestType' = USB_CDC_SEND_ENCAPSULATED_COMMAND, USB_CDC_GET_ENCAPSULATED_RESPONSE.

Т.е.:

1. устройство получает команду (допустим 'REMOTE_NDIS_QUERY_MSG') через ('USB_CDC_SEND_ENCAPSULATED_COMMAND', control EP).

2. устройство выполняет ее и кладет 8 байт в interrupt EP {RESPONSE_AVAILABLE, 0}.

3. устройство отдает результат (в виде 'REMOTE_NDIS_QUERY_CMPLT') через ('USB_CDC_GET_ENCAPSULATED_RESPONSE', control EP).

Все.

Сами данные передаются как есть, без всяких управляющих команд (c заголовком REMOTE_NDIS_PACKET_MSG).

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


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

Спасибо за подробный ответ!

 

Теперь с интерфейсом стало относительно понятно.

хотелось бы узнать по поводу дискрипторов:

 

1. обязательно ли иметь такую же адрессацию у Endpoint'ов, как описано в мануале на драйвер или эти значения могут быть другими ?

к пример bEndpointAddress равно не 0x03 для Data Out Endpoint , а 0x06.

 

2. в USB Communication Class Interface Descriptor=>7 bInterfaceProtocol (Vendor-specific protocol) значение стоит 0xFF, а мой компилятор прошивки ругается на это значение? насколько оно критично?

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


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

Спасибо за подробный ответ!

 

Теперь с интерфейсом стало относительно понятно.

хотелось бы узнать по поводу дискрипторов:

 

1. обязательно ли иметь такую же адрессацию у Endpoint'ов, как описано в мануале на драйвер или эти значения могут быть другими ?

к пример bEndpointAddress равно не 0x03 для Data Out Endpoint , а 0x06.

 

2. в USB Communication Class Interface Descriptor=>7 bInterfaceProtocol (Vendor-specific protocol) значение стоит 0xFF, а мой компилятор прошивки ругается на это значение? насколько оно критично?

 

1. Нет, адреса могут быть любыми.

2. Не знаю. У меня стояло USB_CDC_ACM_PROTO_VENDOR (0xFF). Будет ли работать при другом значении - не знаю.

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


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

1. Нет, адреса могут быть любыми.

2. Не знаю. У меня стояло USB_CDC_ACM_PROTO_VENDOR (0xFF). Будет ли работать при другом значении - не знаю.

1. Да, вроде так получилось.

2. проблема решилась сама собой. видима keil дурил, когда микрокод компилил.

 

 

Написал вроде inf файл. в USB сниффере увидил попытку старта от rndisx.sys, которая провалилась.

следующим этапом буду реализоватьответный интерфейс в FPGA

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


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

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

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

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

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

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

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

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

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

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