|
|
  |
mt32 под EP3C25 не работает в режиме Burst, Проблема организации пакетного режима |
|
|
|
Jul 9 2012, 09:09
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(xxxmatrixxx @ Jul 9 2012, 11:50)  У меня виснет, когда я захватываю шину, становлюсь мастером на шине и пишу в ПК... Тогда тебе нужен пример настройки DMA из под Linux Вот схематично процесс Код pci_register_driver() // -> Linux зовет вашу probe функцию probe() { pci_enable_device() pci_set_master() pci_request_regions() pci_resource_start() // -> Возвращает физ адрес вашего пространства (в BAR0) BAR0=ioremap() // -> Возвращает вирт. адрес BAR0 pci_set_dma_mask(pdev, DMA_32BIT_MASK) pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); DMA=pci_alloc_consistent(pdev,length,&dma_buffer_ph); // -> Возвращает виртуальный адрес DMA // В dma_buffer_ph возвращается физ адрес для DMA BAR0[your_dma_address]=dma_buffer_ph; // В регистр на вашей плате (доступный через BAR0) пишете адрес для DMA // Стартуете DMA }
|
|
|
|
|
Jul 9 2012, 09:25
|
Участник

Группа: Участник
Сообщений: 49
Регистрация: 28-03-12
Из: Санкт-Петербург
Пользователь №: 71 050

|
Цитата(Serhiy_UA @ Jul 9 2012, 13:01)  У меня mt32 на Cyclone III работает как в Линук, так и в ДОС. BAR0 и BAR1 проецируются на память ПК, а BAR2 и BAR3 на регистры ввода-вывода в mt32. Один из последних используется для приема начального адреса (через запрос на прерывание), по которому потом в память ПК начинает записываться массив. Правда я записываю в память ПК последовательно по слову, может быть и для того, чтобы не занимать надолго PCI-шину, были сомнения, что иначе ограничивается производительность программы на ПК… Заметил, что Ваша программа работает с ClkPCI и Clk50. У меня тоже две частоты, обошел коллизии тем, что работаю с внутренним ОЗУ на одной более высокой в процессе подготовки данных, а потом при работе с шиной переключаю на ClkPCI. Ну и соответственно два банка для подготовки данных, работающих по принципу «пинг-понг»… Я использую очередь для согласования частот, а так же по функциональности она больше подходит.... У меня просьба, не смогли бы скинуть код, часть кода, где видно, как работаете с корой как с мастером, какие настройки для коры ставите, чтобы работать как мастер.... Может у вас будет код под Линукс, где выделяете память, конфигурируете ее под линукс... Я буду очень благодарен... просто мучаюсь уже 2ю неделю, а копать не очень понимаю где...
|
|
|
|
|
Jul 9 2012, 10:00
|
Знающий
   
Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112

|
Цитата(xxxmatrixxx @ Jul 9 2012, 12:25)  ..какие настройки для коры ставите, чтобы работать как мастер.... По поводу корки PCI_bb, как черного ящика. Не нашел в Вашей программе определения параметров для mt32. Мои, в приложении. Правда, в предыдущем посте я ошибся по BAR3, но это не принципиально... Программы на ПК под PCI-шину не пишу, пока только синтез ПЛИС...
|
|
|
|
|
Jul 9 2012, 12:08
|
Участник

Группа: Участник
Сообщений: 49
Регистрация: 28-03-12
Из: Санкт-Петербург
Пользователь №: 71 050

|
Цитата(Serhiy_UA @ Jul 9 2012, 14:00)  По поводу корки PCI_bb, как черного ящика. Не нашел в Вашей программе определения параметров для mt32. Мои, в приложении. Правда, в предыдущем посте я ошибся по BAR3, но это не принципиально... Программы на ПК под PCI-шину не пишу, пока только синтез ПЛИС... вот параметры: CODE pci_mt32_inst.CLASS_CODE = 24'hff0000, pci_mt32_inst.DEVICE_ID = 16'h0005, pci_mt32_inst.REVISION_ID = 8'h01, pci_mt32_inst.SUBSYSTEM_ID = 16'h0000, pci_mt32_inst.SUBSYSTEM_VENDOR_ID = 16'h0000, pci_mt32_inst.TARGET_DEVICE = "NEW", pci_mt32_inst.VENDOR_ID = 16'h1172, pci_mt32_inst.MIN_GRANT = 8'h00, pci_mt32_inst.MAX_LATENCY = 8'h00, pci_mt32_inst.CAP_PTR = 8'h40, pci_mt32_inst.CIS_PTR = 32'h00000000, pci_mt32_inst.BAR0 = 32'hfff00008, pci_mt32_inst.BAR1 = 32'hfff00008, pci_mt32_inst.BAR2 = 32'hfff00000, pci_mt32_inst.BAR3 = 32'hfff00000, pci_mt32_inst.BAR4 = 32'hfff00000, pci_mt32_inst.BAR5 = 32'hfff00000, pci_mt32_inst.NUMBER_OF_BARS = 32'h00000002, pci_mt32_inst.HARDWIRE_BAR0 = 32'h00000000, pci_mt32_inst.HARDWIRE_BAR1 = 32'h00000000, pci_mt32_inst.HARDWIRE_BAR2 = 32'h00000000, pci_mt32_inst.HARDWIRE_BAR3 = 32'h00000000, pci_mt32_inst.HARDWIRE_BAR4 = 32'h00000000, pci_mt32_inst.HARDWIRE_BAR5 = 32'h00000000, pci_mt32_inst.HARDWIRE_EXP_ROM = 32'h00000001, pci_mt32_inst.EXP_ROM_BAR = 32'hfff00000, pci_mt32_inst.PCI_66MHZ_CAPABLE = "YES", pci_mt32_inst.INTERRUPT_PIN_REG = 8'h01, pci_mt32_inst.ENABLE_BITS = 32'h00000000;
|
|
|
|
|
Jul 9 2012, 12:33
|
Знающий
   
Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112

|
Цитата(xxxmatrixxx @ Jul 9 2012, 15:08)  pci_mt32_inst.BAR0 = 32'hfff00008, pci_mt32_inst.BAR1 = 32'hfff00008, попробуйте эти параметры упростить: запросить поменьше памяти и без "Prefetchable" Цитата(xxxmatrixxx @ Jul 9 2012, 15:08)  pci_mt32_inst.PCI_66MHZ_CAPABLE = "YES", тоже, пока бы с "NO"... И еще, Вы уже работали с прямым доступом к памяти, хотя бы без режима Burst? ...Еще, вставьте регистр в пространство ввода/вывода и попробуйте записать в него что либо из программы ПК, с выдачей на светодиод. А также считать в ПК... Чтобы увидеть работу корки mt32. Потом в подобном стиле подергать прерываниями.... ...Да, и главное. Регистры в пространстве вводв/вывода должны обязательно быть. Иначе как корка (и за ней FSM) может получить адрес памяти в ПК, назначенный и зарезервированный при инициализации BIOSом, к которому можно обращаться. В заданных Вами параметрах этих регистров нет....
|
|
|
|
|
Jul 10 2012, 06:22
|
Участник

Группа: Участник
Сообщений: 49
Регистрация: 28-03-12
Из: Санкт-Петербург
Пользователь №: 71 050

|
Цитата(Serhiy_UA @ Jul 9 2012, 16:33)  попробуйте эти параметры упростить: запросить поменьше памяти и без "Prefetchable"
тоже, пока бы с "NO"... И еще, Вы уже работали с прямым доступом к памяти, хотя бы без режима Burst?
...Еще, вставьте регистр в пространство ввода/вывода и попробуйте записать в него что либо из программы ПК, с выдачей на светодиод. А также считать в ПК... Чтобы увидеть работу корки mt32. Потом в подобном стиле подергать прерываниями....
...Да, и главное. Регистры в пространстве вводв/вывода должны обязательно быть. Иначе как корка (и за ней FSM) может получить адрес памяти в ПК, назначенный и зарезервированный при инициализации BIOSом, к которому можно обращаться. В заданных Вами параметрах этих регистров нет.... Сделал, как посоветовал, все равно та же тема... А какие настройки у вас установлены в окне выбора Advanced PCI MegaCore Function Features(3е окно при конфигурировании коры)???
|
|
|
|
|
Jul 10 2012, 06:39
|
Знающий
   
Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112

|
Цитата(xxxmatrixxx @ Jul 10 2012, 09:22)  А какие настройки... См.приложение...[attachment=69714:Par_PCI_Comp.zip]
|
|
|
|
|
Jul 10 2012, 07:01
|
Участник

Группа: Участник
Сообщений: 49
Регистрация: 28-03-12
Из: Санкт-Петербург
Пользователь №: 71 050

|
Цитата(Serhiy_UA @ Jul 10 2012, 10:39)  См.приложение...[attachment=69714:Par_PCI_Comp.zip] Спасибо, похоже дело не в настройках коры... Не могли бы скинуть код, как работаете с корой,т.е. где видно, когда и какие сигналы выставляются на PCIcore...
|
|
|
|
|
Jul 10 2012, 07:32
|
Участник

Группа: Участник
Сообщений: 49
Регистрация: 28-03-12
Из: Санкт-Петербург
Пользователь №: 71 050

|
Цитата(Serhiy_UA @ Jul 10 2012, 11:24)  Не могу. Труд оказался немалый... так мне не весь код нужен))) а именно часть код, где видно только когда выставляются lm_framen, lm_rdyn, lm_last... интересен сам алгоритм работы с корой, как с мастером... просто хочется сравнить, понять, что я делаю не так... а если все верно, то выкатить программисту под linux...
|
|
|
|
|
Jul 11 2012, 13:56
|
Участник

Группа: Участник
Сообщений: 49
Регистрация: 28-03-12
Из: Санкт-Петербург
Пользователь №: 71 050

|
Нашел в чем ошибка)))))))Причем только сейчас))))
Всем спасибо, кто откликнулся на мою просьбу!!! ОЧень помогли!!!
Пришлось перерыть всю документацию на PCIcore, стандарт PCI... а ошибка была в назначении пина))))) вернее я прогу свою, которую писал под таргет, начал переделывать под мастера(изначально предполагалось работать таргетом, но скорость требует другой реализации) и пин, который контролирует ошибку паритета(perrn), был направлен только на выход, а на мастере должен быть и на вход и на выход....
Короче, очень глупая ошибка,которую начинаешь рассматривать только когда все перероешь)))
Но слава Богу хоть так - 2 недели работы и 2 мин после того, как обнаружил ошибку))))
Всем спасибо)))
Сообщение отредактировал xxxmatrixxx - Jul 12 2012, 11:53
|
|
|
|
|
Jul 12 2012, 11:57
|
Участник

Группа: Участник
Сообщений: 49
Регистрация: 28-03-12
Из: Санкт-Петербург
Пользователь №: 71 050

|
Извините за поспешные выводы...
Сейчас добился того, что работает все в мультизаписи.... все сигналы выставляются как надо, и кажется куда надо пишется и ничего не виснет...
Возникли следующие проблемы:
1. Почему-то передается только 64 32х битных слова... потом lm_ackn защелкивается на 1 и заканчивает работу... это по станларту так положено, что при мультизаписи передается только 64 слова???
2. Программист под линукс читает только 0... хотя видно, что от меня все данные уходят, сопровождаемые соответствующими сигналами...
Кто-нибудь сталкивался с такими проблемами?????
|
|
|
|
|
Jul 12 2012, 12:16
|
Знающий
   
Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112

|
Цитата(xxxmatrixxx @ Jul 12 2012, 14:57)  1. Почему-то передается только 64 32х битных слова... pci_mt32_inst.MAX_LATENCY = 8'h00, попробуйте этот параметр поменять... Цитата(xxxmatrixxx @ Jul 12 2012, 14:57)  Программист под линукс читает только 0... ...для начала передавайте по одному-два слова...
|
|
|
|
|
Jul 12 2012, 13:28
|
Участник

Группа: Участник
Сообщений: 49
Регистрация: 28-03-12
Из: Санкт-Петербург
Пользователь №: 71 050

|
Цитата(Serhiy_UA @ Jul 12 2012, 16:16)  pci_mt32_inst.MAX_LATENCY = 8'h00, попробуйте этот параметр поменять... Пробовал менять этот параметр - не помогло, а когда отключил его вообще(latency timer off), то заработало.... Спасибо Цитата(Serhiy_UA @ Jul 12 2012, 16:16)  ...для начала передавайте по одному-два слова... а вот на сторону ПК от PCI приходит похоже что-то, но затирается... т.е. я организовал мультизапись, выставил адрес, установил соединение, и считаю, что адрес с каждым тактом будет на стороне ПК увеличиваться на 4(кажется), а похоже вся инфа долбит в 1у ячейку, т.е. по одному и тому же адресу... получается должно быть записано последнее значение, что я кидал... по опытам так и происходит... Вопрос: программист под линукс может отслеживать, что приходит ему по PCI за такт??? однозначно ли определяется мультизапись на стороне ПК под Линукс,т.е. ПК автоматом увеличивает адрес с каждым тактом, когда я пишу при мультизаписи?
Сообщение отредактировал xxxmatrixxx - Jul 12 2012, 13:49
|
|
|
|
|
Jul 12 2012, 17:16
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(xxxmatrixxx @ Jul 12 2012, 17:28)  программист под линукс может отслеживать, что приходит ему по PCI за такт??? Нет Цитата однозначно ли определяется мультизапись на стороне ПК под Линукс,т.е. ПК автоматом увеличивает адрес с каждым тактом, когда я пишу при мультизаписи? Насколько я помню стандарт (давненько это было, увы) адрес в транзакции указывается 1 раз. Так что пока транзакция не кончится, она должна ложиться по последовательным адресам (если вы конечно не в IO пространство пишете)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|