Jump to content

    

Boom-Zoom

Участник
  • Content Count

    20
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Boom-Zoom

  • Rank
    Участник
  1. В квартусе я только мышкой пины с модулем nios соединять умею) Но если правильно понял и речь о RGMII интерфейсе то у меня было две ситуации связанные с DDIO (Quartus 13.1): - проект не собирался если в сигнал тап была попытка анализировать внутренний регистр U_RGMII корки TSE и пины используемые интерфейсом RGMII, на анализ нужно было ставить что то одно; - мне советовали в assignment editor добавить правило, в котором нужно указать что пины RGMII подключаются через DDIO регистры. Попробовал, проект так же не собирался. Поэтому у меня в проекте содержимое assignment editor,почти, отражает содержимое pin planner, правило global clock добавлял на входную тактовую. И ещё правилами тактовых приёма и передачи игрался, в каком они состоянии не помню.
  2. Недавно удалось получить положительный результат. Решил похвалиться) И рассказать о ключевых моментах. Во первых решил сначала пробовать запускать проект на 100 мб используя MII. Опытный коллега, который использовал MII/GMII интерфейс выдал самописный коммутатор сигналов, который нужен для полноценной поддержки трёх скоростей. Без него либо 10/100 либо 1000. Этот коммутатор есть на картинках в руководстве на корку TSE в виде кубика, с описанием принципа его работы. Картинку я вспомнил, описание не вспомнил) но перечитывать не стал т.к. выдали обкатанное решение. Ещё дал совет перепроверить автосогласование. Вставил к себе в проект ииии... ничего не заработало. Стал копаться в процессе автосогласования. Заметил такою вещь - с партнёром у которого принудительно выставленно 100 у меня поднимается линк 1000. Подумал...Почитал... Нашёл статусные регистры в которых есть данные о поддерживаемых партнёром режимах работы. В итоге добавил в функцию настройки марвела цикл ожидания окончания процесса автосогласования. Написал функцию которая читает статусные регистры марвела, хранящие свой режим работы и режим работы партнёра, на их основе определяет максимальную, общую для себя и партнёра скорость и основываясь на этой скорости настраивает три бита SPEED, 10MB и HALF_DUPLEX в регистре команд TSE. Общий смысл такой: если оба партнёра поддерживают 1000 полный дуплекс, то биты 10MB и HALF_DUPLEX выставлять не надо. Если общая максимальная скорость 100 полный дуплекс, то биты SPEED и HALF_DUPLEX выставлять не надо и т.д. После вызова PHYDeviceInit(); Добавил вызов новой функции. Соответственно переколбасил настройку регистра команд дальше по тексту. Запустил. Немного поотлаживал протоколы arp и icmp и всё заработало как часы. Пробовал на 100 полный дуплекс (это MII) и 1000 полный дуплекс (GMII). Переконфигурировал корку TSE на RGMII, изменил режим работы марвела с GMII на RGMII, зашил. И RGMII завёлся с полпинка. PROFIT))). Всем отвечавшим и сопереживавшим спасибо. Надеюсь кому то эта тема поможет.
  3. Спасибо за совет, проверю. Пока решил на GMII перейти, перенастроил проект, данные из TSE сразу появились. Но передачи в сеть сегодня так и не добился. Решил что сначала дожму GMII, потом вернусь к RGMII.
  4. Общую тактовую подаю на PLL, повышаю её в два раза, от 250 МГц тактирую SignalTap и собственно в нём смотрю. Если вы про осциллограф, то до него ещё дело не дошло т.к. эти линии внутри ПЛИС не вырабатываются.
  5. Про передачу марвелом я почитываю... Но сейчас дело в том что от 88E1111 в сторону TSE данные идут (приём работает). А в обратную сторону данные на TSE от системы обработки поступают, но на выход TSE данные не выставляет. Может быть кто то сможет скрины из SignalTap выложить с успешной транзакцией(переданным далее по RGMII пакетом) по Avalon-St от SGDMA к TSE? Или может быть есть ещё какая то информация относительно линий ff_tx_mod[1..0] которую я упустил?
  6. Всем доброго времени суток! Некоторое время назад начал разбираться с интерфейсом RGMII и уже неделю не могу добиться данных на передачу по этому интерфейсу. Своих идей уже нет и как я почитал на форумах такой проблемы ни у кого и близко не было, в основном затыки на передачу на уровне физики возникают. Исходный данные у меня такие: -IDE Quartus 13.1; -отладочная плата на базе Stratix III, на ней микросхема PHY 88E1111; -PHY и TSE сконфигурировал для связи по RGMII, тактовая 125 МГц; -обработка пакетов производится связкой TSE+SGDMA+NIOS2; -TSE сконфигуриван с выравниванием по 32; -соединение отладочной платы с ПК точка-точка; -приём настроить удалось, пакет от ПК (ARP) сохраняется в память, по прерыванию я его обрабатываю и отправляю ответ; -SGDMA_tx обрабатывает дескриптор, и я вижу в SignalTap как по шине Avalon-ST в TSE передаётся сформированный мной ответный пакет (скрин 1 из SignalTap); И тут у меня вопрос: SGDMA отновременно с концом пакета EOP выставляет 4 байта данных (frame word) и out_empty[1..0]=2, которые подключены к линиям ff_tx_mod[1..0] корки TSE - в доке на TSE говорится что это "Indicates invalid bytes in the final frame word", а русской доке на Avalon-ST говорится что EOP интепретируется каждым ведомым индивидульно. Вопрос 1: теоретически всё правильно-SGDMA сказал TSE сколько валидных байт защёлкнуть на такте при появлении EOP? Вопрос 2: эта же двойка присутствует на такте "старт пакета" - это правильно? -тактовую на вход TSE интерфейса RGMII tx_clk подаю от PLL 125 МГц; -в SignalTap по фильтру all names удалось найти внутренние линии/отладочные регистры корки TSE под названием U_RGMII и на линии tx_data я вижу свои данные вместе с безошибочной преамбулой RGMII на передачу и двумя потерянными байтами 0xFF, tx_control не вижу (скрин 2 из SignalTap); -на пинах не вижу не tx_data не tx_control; Вопрос 3: если с выравниванием проблемы нет то куда можно капнуть? -адрес буфера с пакетом выравнивал на 32, но пока писал что то сомневаться начал, после праздника попробую поиграться.... -передача по TSE разрешена, прикреплю на всякий случай код настройки TSE; -HW reset от кнопки есть и использую; void MacInit() { // Initialize MAC registers IOWR_ALTERA_TSEMAC_CMD_CONFIG( TSE_MAC_BASE, IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) | ALTERA_TSEMAC_CMD_SW_RESET_MSK ); while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK); //Установил адрес MDIO устройства IOWR_ALTERA_TSEMAC_MDIO_ADDR0(TSE_MAC_BASE, 0x12); //Инициализация физического уровня HWresetPHY(); PHYDeviceInit(); //Шаг a alt_u32 mode = 0; //Запрещяю приём и передачу mode = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) & (~ALTERA_TSEMAC_CMD_TX_ENA_MSK) & (~ALTERA_TSEMAC_CMD_RX_ENA_MSK); IOWR_ALTERA_TSEMAC_CMD_CONFIG( TSE_MAC_BASE, mode ); //Жду когда биты разрешения приёма и передачи станут 0 при чтении mode = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE); while( (mode & ALTERA_TSEMAC_CMD_TX_ENA_MSK) || (mode & ALTERA_TSEMAC_CMD_RX_ENA_MSK) ) mode = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE); //IOWR_32DIRECT( TSE_MAC_BASE, 0xD0*4, 8<<16 ); //Шаг b IOWR_ALTERA_TSEMAC_RX_ALMOST_EMPTY(TSE_MAC_BASE, 8); IOWR_ALTERA_TSEMAC_RX_ALMOST_FULL(TSE_MAC_BASE, 8); IOWR_ALTERA_TSEMAC_RX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_RECEIVE_FIFO_DEPTH-16); IOWR_ALTERA_TSEMAC_RX_SECTION_FULL(TSE_MAC_BASE, 16); IOWR_ALTERA_TSEMAC_TX_SECTION_EMPTY(TSE_MAC_BASE, TSE_MAC_TRANSMIT_FIFO_DEPTH-16); IOWR_ALTERA_TSEMAC_TX_ALMOST_FULL(TSE_MAC_BASE, 3); IOWR_ALTERA_TSEMAC_TX_ALMOST_EMPTY(TSE_MAC_BASE,8); IOWR_ALTERA_TSEMAC_TX_SECTION_FULL(TSE_MAC_BASE, 16); //Шаг c IOWR_ALTERA_TSEMAC_MAC_0(TSE_MAC_BASE,0x7761632A); IOWR_ALTERA_TSEMAC_MAC_1(TSE_MAC_BASE,0x00002A61); //Шаг d IOWR_ALTERA_TSEMAC_FRM_LENGTH(TSE_MAC_BASE, 1518);//frame length 16-bit - 1518 IOWR_ALTERA_TSEMAC_TX_IPG_LENGTH(TSE_MAC_BASE,12); //IOWR_ALTERA_TSEMAC_PAUSE_QUANT(TSE_MAC_BASE, 0xFFFF); //XON //IOWR_32DIRECT(TSE_MAC_BASE, 0x44, 0xFFFF); //XOFF mode = ALTERA_TSEMAC_CMD_XON_GEN_MSK | ALTERA_TSEMAC_CMD_ETH_SPEED_MSK | ALTERA_TSEMAC_CMD_PROMIS_EN_MSK | ALTERA_TSEMAC_CMD_HD_ENA_MSK | ALTERA_TSEMAC_CMD_TX_ADDR_INS_MSK //| ALTERA_TSEMAC_CMD_LOOPBACK_MSK | ALTERA_TSEMAC_CMD_XOFF_GEN_MSK | ALTERA_TSEMAC_CMD_CNT_RESET_MSK | ALTERA_TSEMAC_CMD_RX_ERR_DISC_MSK; IOWR_ALTERA_TSEMAC_CMD_CONFIG( TSE_MAC_BASE, mode); //Шаг e IOWR_ALTERA_TSEMAC_CMD_CONFIG( TSE_MAC_BASE, mode | ALTERA_TSEMAC_CMD_SW_RESET_MSK ); while(IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE) & ALTERA_TSEMAC_CMD_SW_RESET_MSK); //alt_u32 rr = IORD_32DIRECT(TSE_MAC_BASE, 0x3A*4); //Шаг f mode |= ALTERA_TSEMAC_CMD_TX_ENA_MSK | ALTERA_TSEMAC_CMD_RX_ENA_MSK; IOWR_ALTERA_TSEMAC_CMD_CONFIG( TSE_MAC_BASE, mode ); //Жду когда биты разрешения приёма и передачи станут 1 при чтении mode = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE); while( !(mode & ALTERA_TSEMAC_CMD_TX_ENA_MSK) || !(mode & ALTERA_TSEMAC_CMD_RX_ENA_MSK) ) mode = IORD_ALTERA_TSEMAC_CMD_CONFIG(TSE_MAC_BASE); } Заранее спасибо за ответы)
  7. http://dmilvdv.narod.ru/Translate/ELSDD/in...dded_linux.html Отличный ресурс
  8. Драйвер не работал из за того что в конфиге железа и в файле config.c были приняты разные соглашения об именовании диапазона ВВ контроллера и прерывания, привёл дефайны в соответствие.
  9. Вопрос надо закрыть... Решил проблему, elf был слинкован динамически, а нужные библиотеки не компилировались, слинковал статически и всё заработало.
  10. то ли в книжке про ядро, то ли в статье из инета такой обобщённый пример настройки модуля был
  11. Может я чего то не понял, но timer_pdata[] - имя массива само по себе указатель, а так как строка неопределённой длины должна оканчиваться нулём static const char timer_pdata[] {" "0", /* 0 is the name of the timer */ ",NULL}
  12. Пишет что неверный символ, по разному пробовал подставлять modinfo- не знал про такую утилиту, попробую завтра
  13. Всем привет! Мне необходимо пондять сеть на микро линуксе, проблема заключается в том что драйвер не стартует. Название драйвера smc91x. Сетку поднимаю на отладочной плате 2C35 с ПЛИС CycloneII фирмы Альтера, разработчик рекомендует его делать встроеным (такой способ приведё у них в WiKi и на форуме), но у меня ничего не выходит, так же как и с модулем. Компилируя модуль, драйвер компилится, на выходе получается файл smc91x.ko. Кладу его в папку /usr (мне так удобне), далее в файле modprobe.conf добавляю строку alias eth0 smc91x. В заголовке исходника драйвера написано что ему нужно передать три аргумента: базовый адрес, прерывание и время ожидания. Добавляю в modprobe.conf строку options smc91x io=0x300(подсмотрел из загрузки линукса скомпилинного производителем) irq=6 (знаю точно) nowait=0 (по умолчанию). Затем в папке /usr делаю depmod -a smc91x.ko он у меня ругается на расположение файла, переношу его в /lib/modules/2.6.34 делаю depmod -a smc91x.ko. Никакого вывода не происходит (пробовал разные ключи), я так понял что зависимостей нет? Делаю modprobe smc91x в ответ SEGV, так же был вариант - не поддерживаемый тип файла Пробую insmod smc91x.ko - драйвер добавляется lsmod module smc91x size 21706 used 0 Пробую ifconfig eth0 up в ответ SIOCGIFFLAGS: no such device В module_init и ещё несколько функций драйвера добавил свой printk, но не один ничего не вывел. Такое ощущение что он грузится в память, но управление ему не передается. Если делать драйвер встроенным всё компилится, в файле который содержит названия встроенных модулей (не помню его название) имя нужного драйвера есть. Передаю параметры через kernelargs netdev=6,0x300,0x30f,0,eth0 в соответсвии с доком на параметры моего ядра, т.к. моему драйверу надо три параметра то лишние откинутся (я так предпологаю, точно не уверен) Суть в том что драйвер молчит в обоих случаях. Подскажите куда копать? Может в ядре поддержу чегото ещё включить/убрать? ПРИЛОЖЕНИЯ: На скриншоте лог с нормальной загрузкой драйвера при старте образа от Альтеры kernel_config_.txt dreiver_source_smc91x.txt kernel_parameters.txt
  14. 1. elf точно не для ПК, strace попробую. 2 точно-ссылка Сижу копаюсь в кишках... нашёл интересный сайт про uclinux где подробно расписан процесс его загрузки...
  15. Решил всётаки запустить инит. В процессе разбирательств выяснил что инит в КФС присутствует в elf формате, когда патаешься его запустить пишет can't execute, если компилишь инит не стандартный, а из busybox инит получается бинарный при его запуске выводится сообщении смысл коготорого в том что инит первый запускаемый процесс и система виснет. Загрузив zImage от производителя и попробовав запустить инит (elf формат), он нормально исполняется - пытается монтировать vfs proc и sysfs выводит лого и возвращается в консоль. Перепробовал много вариантов конфигурации, начал разбираться с логикой запуска инит... В следствии чего возникли вопросы: - как будет вести себя инит если inittab пустой или отсутствует, или он его не находит? - по какой причине может не запустится elf файл (предпологаем что скомпилирован он с нужными параметрами), может ли он начать исполнение, но не найдя каких то зависимостей выдать такое сообщение? - и почему инит исполняемый файл, а не скрипт?