|
|
  |
Ethernet и USB на одном Cyclone |
|
|
|
Jun 15 2012, 09:03
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 24-10-11
Из: Санкт-Петербург
Пользователь №: 67 915

|
Возникла необходимость создать устройство, подключающееся в слот PCIe и выполняющее функции USB-хоста и сетевой карты Ethernet одновременно. Как правильно организовать конфигурационное пространство PCIe, чтобы плата определялась ПО компьютера и как USB-хост, и как сетевая карта? Такое возможно? Если нет, то возможно ли динамическое реконфигурирование? Насколько я понимаю, за определение типа устройства отвечает поле CLASS CODE в конфигурационном пространстве, и оно только одно...
|
|
|
|
|
Jun 18 2012, 07:29
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 24-10-11
Из: Санкт-Петербург
Пользователь №: 67 915

|
Цитата(Boris_TS @ Jun 15 2012, 16:59)  А какой именно Ethernet нужен ? И... что вы хотите делать с данными, которые будете передавать в USB устройства ? - только честно - тут все свои, хе-хе. Гигабитный. С USB будет осуществляться загрузка ОС. Тут вопрос не в том, как это реализовать схемотехнически, а скорее в том, какая прошивка должна быть в PCIe-контроллере(Cyclone IV Altera) на плате, чтобы все правильно распозналось и функционироввло.
|
|
|
|
|
Jun 18 2012, 09:11
|
Знающий
   
Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515

|
Цитата(Владимир_О @ Jun 15 2012, 13:03)  Возникла необходимость создать устройство, подключающееся в слот PCIe и выполняющее функции USB-хоста и сетевой карты Ethernet одновременно. Как правильно организовать конфигурационное пространство PCIe, чтобы плата определялась ПО компьютера и как USB-хост, и как сетевая карта? Такое возможно? Если нет, то возможно ли динамическое реконфигурирование? Насколько я понимаю, за определение типа устройства отвечает поле CLASS CODE в конфигурационном пространстве, и оно только одно... Теоретически возможно. В PCI это называется multifunction device, и каждая функция имеет своё конфигурационное адресное пространство, которое выбирается полем "function" в адресе при конфигурационных циклах. Другое дело, что надо ещё найти или написать корку, которая поддерживает mutifunction на PCIe, например, корка lattice это не умеет.
|
|
|
|
|
Jun 18 2012, 14:21
|
Злополезный
   
Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188

|
Цитата(Владимир_О @ Jun 18 2012, 11:29)  Гигабитный. С USB будет осуществляться загрузка ОС.
Тут вопрос не в том, как это реализовать схемотехнически, а скорее в том, какая прошивка должна быть в PCIe-контроллере(Cyclone IV Altera) на плате, чтобы все правильно распозналось и функционироввло. Мда, вопрос, конечно, не в схемотехнике... вопрос в системотехнике. Вопрос исключительно системного характера: Если вы хотите использовать какие-либо стандартные драйвера, то вы должны сделать стандартное же устройство. Это значит, что это стандартное устройство употребит все BAR PCI(e) устройства. Если необходимо реализовать более 1 устройства, и как минимум одно из них должно быть стандартным, то вам нужно PCI multi function device, обладающий несколькими конфигурационным пространствами. О чём было написано выше: Цитата(Timmy @ Jun 18 2012, 13:11)  Теоретически возможно. В PCI это называется multifunction device, и каждая функция имеет своё конфигурационное адресное пространство, которое выбирается полем "function" в адресе при конфигурационных циклах. Другое дело, что надо ещё найти или написать корку, которая поддерживает mutifunction на PCIe, например, корка lattice это не умеет. Добавлю, Xilinx в Virtex-5 тоже этого сделать не могла. Есть ли поддержка в Virtex-6/7 – не знаю,.. но что-то сильно сомневаюсь. Думаю, что и Altera далеко не ушла от соседей, но: кто знает ? А стандартных Gigabit Ethernet NIC - просто нет. Поэтому, проще поставить PCI-E switch и прицепить к нему несколько устройств, в т.ч. и микросхемы: 1. стандартный USB EHCI host. 2. покупной PCI-E Gigabit Ethernet NIC (Marvell. Realtek и пр.). Иначе это всё превратиться в редкостный маразм. И всё-таки чем вам не подходит внешний USB EHCI host ? Зачем вы эту гадость (USB) хотите упхать в ПЛИС ? Зачем вы хотите туда же и Gigabit Ethernet положить ? Шифровать передаваемые данные хотите ? - так напишите об этом честно ! Как я говорил раньше - тут все свои.
|
|
|
|
|
Jun 19 2012, 05:56
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 24-10-11
Из: Санкт-Петербург
Пользователь №: 67 915

|
Цитата(Boris_TS @ Jun 18 2012, 18:21)  Мда, вопрос, конечно, не в схемотехнике... вопрос в системотехнике. Вопрос исключительно системного характера: Если вы хотите использовать какие-либо стандартные драйвера, то вы должны сделать стандартное же устройство. Это значит, что это стандартное устройство употребит все BAR PCI(e) устройства. Если необходимо реализовать более 1 устройства, и как минимум одно из них должно быть стандартным, то вам нужно PCI multi function device, обладающий несколькими конфигурационным пространствами. О чём было написано выше: Добавлю, Xilinx в Virtex-5 тоже этого сделать не могла. Есть ли поддержка в Virtex-6/7 – не знаю,.. но что-то сильно сомневаюсь. Думаю, что и Altera далеко не ушла от соседей, но: кто знает ?
А стандартных Gigabit Ethernet NIC - просто нет.
Поэтому, проще поставить PCI-E switch и прицепить к нему несколько устройств, в т.ч. и микросхемы: 1. стандартный USB EHCI host. 2. покупной PCI-E Gigabit Ethernet NIC (Marvell. Realtek и пр.). Иначе это всё превратиться в редкостный маразм.
И всё-таки чем вам не подходит внешний USB EHCI host ? Зачем вы эту гадость (USB) хотите упхать в ПЛИС ? Зачем вы хотите туда же и Gigabit Ethernet положить ?
Шифровать передаваемые данные хотите ? - так напишите об этом честно ! Как я говорил раньше - тут все свои. К вопросу реализации - у меня все так и реализовано - в ПЛИС - PCIe-ядро и мастер внутренней шины, на внешних микросхемах - USB(MAX3421E) и Ethernet(Marvell). А вот первая часть ответа мне весьма полезна, спасибо. Проще говоря, мне бы хотелось, чтобы моя плата, на которой реализован и USB-хост, и Ethernet-контроллер, смогла работать со стандартными драйверами. Если это сложнореализуемо, то придется все же заняться драйвером...
|
|
|
|
|
Jun 19 2012, 06:40
|
Злополезный
   
Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188

|
Цитата(Владимир_О @ Jun 19 2012, 09:56)  К вопросу реализации - у меня все так и реализовано - в ПЛИС - PCIe-ядро и мастер внутренней шины, на внешних микросхемах - USB(MAX3421E) и Ethernet(Marvell). А вот первая часть ответа мне весьма полезна, спасибо. С USB я не работал плотно, и что именно реализовано в MAX3421E быстро оценить не могу. «Ethernet(Marvell)» - как я понял у вас стоит Ethernet Phy (аля 88e1111). Цитата(Владимир_О @ Jun 19 2012, 09:56)  Проще говоря, мне бы хотелось, чтобы моя плата, на которой реализован и USB-хост, и Ethernet-контроллер, смогла работать со стандартными драйверами. Если это сложнореализуемо, то придется все же заняться драйвером... Если нет необходимости шифровать данные передаваемые по Ethernet/USB, то, как я и писал выше, проще (по совокупности трудозатрат) поставить 3 стандартные специализированные микросхемы. В противном случае, ваши программисты просто затрахаются реализовывать полноценные Ethernet драйвера, которые необходимо будет писать под каждую операционную систему,.. а потом еще и поддерживать. Поэтому, для Ethernet, я бы рекомендовал использовать Marvell Yukon (например 88E8057). А вот если необходимо извращать данные, то для Ethernet другого пути нет - полный самопал. Для USB устройств извращать данные на уровне PCI-E (или вырасщенного на его основе в ПЛИС OHCI), на мой взгляд, - бессмысленно; ибо в общем случае, топология USB устройства - весьма сильно варьируется. P.S. Кстати, даже если Вы решитесь создать своё самопальное устройство, то вам всё равно потребуется как-то сделать так, чтобы с ним работало сразу 2 разных драйвера: USB Host и Ethernet NIC. Обычно для этого требуется создать 2 "устройства", т.е. вырастить 2 конфигурационных пространства на PCI... можно, конечно, и сваять это всё програмно (драйвер обманка, из которого "растут" USB Host и Ethernet NIC драйвера), но это чреватый и очень мутный путь, хотя тоже - вполне реализуемый.
|
|
|
|
|
Jun 19 2012, 13:24
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 24-10-11
Из: Санкт-Петербург
Пользователь №: 67 915

|
Цитата(Boris_TS @ Jun 19 2012, 10:40)  С USB я не работал плотно, и что именно реализовано в MAX3421E быстро оценить не могу. «Ethernet(Marvell)» - как я понял у вас стоит Ethernet Phy (аля 88e1111).
Если нет необходимости шифровать данные передаваемые по Ethernet/USB, то, как я и писал выше, проще (по совокупности трудозатрат) поставить 3 стандартные специализированные микросхемы. В противном случае, ваши программисты просто затрахаются реализовывать полноценные Ethernet драйвера, которые необходимо будет писать под каждую операционную систему,.. а потом еще и поддерживать. Поэтому, для Ethernet, я бы рекомендовал использовать Marvell Yukon (например 88E8057).
А вот если необходимо извращать данные, то для Ethernet другого пути нет - полный самопал. Для USB устройств извращать данные на уровне PCI-E (или вырасщенного на его основе в ПЛИС OHCI), на мой взгляд, - бессмысленно; ибо в общем случае, топология USB устройства - весьма сильно варьируется.
P.S. Кстати, даже если Вы решитесь создать своё самопальное устройство, то вам всё равно потребуется как-то сделать так, чтобы с ним работало сразу 2 разных драйвера: USB Host и Ethernet NIC. Обычно для этого требуется создать 2 "устройства", т.е. вырастить 2 конфигурационных пространства на PCI... можно, конечно, и сваять это всё програмно (драйвер обманка, из которого "растут" USB Host и Ethernet NIC драйвера), но это чреватый и очень мутный путь, хотя тоже - вполне реализуемый. Спасибо. Ситуация определенно проясняется для меня, что само по себе радует. Вот теперь, на основании вышесказанного, задался вопросом - может ли плата с Ethernet'ом работать slave'ом на PCIe шине? То бишь драйвер должен постоянно опрашивать эту плату или же она сама по приходу пакета в режиме мастера должна инициировать транзакции на шине?
|
|
|
|
|
Jun 19 2012, 13:47
|
Злополезный
   
Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188

|
Цитата(Владимир_О @ Jun 19 2012, 17:24)  Ситуация определенно проясняется для меня, что само по себе радует. Вот теперь, на основании вышесказанного, задался вопросом - может ли плата с Ethernet'ом работать slave'ом на PCIe шине? То бишь драйвер должен постоянно опрашивать эту плату или же она сама по приходу пакета в режиме мастера должна инициировать транзакции на шине? Без Bus Master'а Gigabit Ethernet реализовывать бессмысленно. У меня было как-то так: 1. приходящие пакеты начинают складываться в FIFO; 2. как только хоть 1 целый пакет принят - выставляется IRQ. 3. по IRQ самопальный NIC Driver настраивает Bus Master (куда и сколько лить данных). 4. после переливки части данных из FIFO - новое IRQ, и опять драйвер смотрит, что он может забрать из ОЗУ (машины) и куда Bus Master'у складировать новые пакеты. Вот как-то так оно и работало на вот этом монстрике:
Да, да, помимо Ethernet и USB Host'а, тут еще PATA и SATA... Так что о маразмах, говорю не понаслышке,.. а по собственному опыту + опыту коллег. P.S. я делал Ethernet часть, на которой удавалось передавать файлы (по ftp) со скоростями от 110 до 112 МБайт/с.
|
|
|
|
|
Jun 22 2012, 08:59
|
Участник

Группа: Свой
Сообщений: 68
Регистрация: 24-10-11
Из: Санкт-Петербург
Пользователь №: 67 915

|
Цитата(Boris_TS @ Jun 19 2012, 17:47)  Без Bus Master'а Gigabit Ethernet реализовывать бессмысленно. У меня было как-то так: 1. приходящие пакеты начинают складываться в FIFO; 2. как только хоть 1 целый пакет принят - выставляется IRQ. 3. по IRQ самопальный NIC Driver настраивает Bus Master (куда и сколько лить данных). 4. после переливки части данных из FIFO - новое IRQ, и опять драйвер смотрит, что он может забрать из ОЗУ (машины) и куда Bus Master'у складировать новые пакеты. Вот как-то так оно и работало на вот этом монстрике:
Да, да, помимо Ethernet и USB Host'а, тут еще PATA и SATA... Так что о маразмах, говорю не понаслышке,.. а по собственному опыту + опыту коллег. P.S. я делал Ethernet часть, на которой удавалось передавать файлы (по ftp) со скоростями от 110 до 112 МБайт/с. То бишь Ethernet был гигабитным... Если не секрет, как получали 125 МГц для его работы?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|