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

 
 
 
Reply to this topicStart new topic
> RNDIS и CY7C68013A c FPGA, создание сетевого интерфейса
SFx
сообщение Apr 22 2009, 08:02
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688



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

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

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

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

Кто может что сказать по реализации драйвера сетевого устройства RNDIS ? Может есть у кого какие Examples ? Поделитесь, плиз. Спасибо.
Go to the top of the page
 
+Quote Post
Concorde
сообщение Apr 27 2009, 20:56
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 5-07-05
Пользователь №: 6 553



Цитата(SFx @ Apr 22 2009, 12:02) *
Назрел вопрос следующего рода:

Имеется 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.
Go to the top of the page
 
+Quote Post
SFx
сообщение Apr 28 2009, 06:24
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688



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

Цитата(Concorde @ Apr 28 2009, 00:56) *
Понадобится один "bulk" и один "interrupt" endpoint.

Странно, я думал еще control нужно.... bulk я так понимаю это на передачу в FPGA, а interrupt - на прием из устройства?
а формат данных принимаемых/передаваемых нигде не описан (кроме как в этом Прикрепленный файл  rndisspc.doc ( 534 килобайт ) Кол-во скачиваний: 2095
файле из MS RNDIS USB kit 2005) ?

дело в том, что хотелось бы устройство кросплатформенным сделать...
Go to the top of the page
 
+Quote Post
Concorde
сообщение Apr 28 2009, 20:52
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 5-07-05
Пользователь №: 6 553



Цитата(SFx @ Apr 28 2009, 10:24) *
Спасибо за ваш комментарий!


Странно, я думал еще control нужно.... bulk я так понимаю это на передачу в FPGA, а interrupt - на прием из устройства?
а формат данных принимаемых/передаваемых нигде не описан (кроме как в этом Прикрепленный файл  rndisspc.doc ( 534 килобайт ) Кол-во скачиваний: 2095
файле из 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).
Go to the top of the page
 
+Quote Post
SFx
сообщение Apr 29 2009, 14:34
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688



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

Теперь с интерфейсом стало относительно понятно.
хотелось бы узнать по поводу дискрипторов:

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

2. в USB Communication Class Interface Descriptor=>7 bInterfaceProtocol (Vendor-specific protocol) значение стоит 0xFF, а мой компилятор прошивки ругается на это значение? насколько оно критично?
Go to the top of the page
 
+Quote Post
Concorde
сообщение Apr 29 2009, 15:04
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 5-07-05
Пользователь №: 6 553



Цитата(SFx @ Apr 29 2009, 18:34) *
Спасибо за подробный ответ!

Теперь с интерфейсом стало относительно понятно.
хотелось бы узнать по поводу дискрипторов:

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). Будет ли работать при другом значении - не знаю.
Go to the top of the page
 
+Quote Post
SFx
сообщение Apr 30 2009, 08:00
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688



Цитата(Concorde @ Apr 29 2009, 19:04) *
1. Нет, адреса могут быть любыми.
2. Не знаю. У меня стояло USB_CDC_ACM_PROTO_VENDOR (0xFF). Будет ли работать при другом значении - не знаю.

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


Написал вроде inf файл. в USB сниффере увидил попытку старта от rndisx.sys, которая провалилась.
следующим этапом буду реализоватьответный интерфейс в FPGA
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 18:25
Рейтинг@Mail.ru


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