Программирование Tundra Universe VME моста

Попытались мы тут, как всегда, сделать невозможное — запрограммировать MilStd1553 модуль Корунд-М, но висит эта фиговина, как мы уже писали ранее, на шине VME.

Шина VME это не та PCI, в которой все просто, понятно и существуют миллионы датащитов и кодов для настройки мостов. Это даже не унылая шина ISA, которую вообще не надо кодить. VME — это мощный, как кувалда, старинный, как мамонт, инструмент в котором есть все от аппаратных семафоров, до различной ширины адресации шины данных и адреса.

Вся настройка шины PCI, находящейся за мостом — это запись по регистрам понятных данных, которые описаны в веселых картинках для даунов. Посмотрел картинку, и все по стандарту записал — регистры описанны спецификацией на шину, у всех мостов они одинаковы — вот это воистину круто.
Шина же VME не стандартизирует такие фичи и кто во что горазд, тот так и клепает свои мосты. К тому же шина VME имеет и разную длину шины адреса и разную длину шины данных — все это надо выбрать и закодить. Программа BIOS (если у вас гамнаIntel) ничего не знает про шину VME и мост остается не конфигурированным в отличии от всех мостов PCI.
В PCI все рабочие адреса современных устройств 32 разрядные.

Мы видим, что и тут с программной точки зрения, мы за PCI(CPCI). А кому нужна шина VME, которую трудно осваивать? Правильно! Военным и тем, кто на них работает) Мы хоть и работаем с военными, но обоснуем любым, что им эта шина не нужна, а нам тем более. Но не в этот раз.

Собственно приступаем к освоению шины VME:

Включили зверушку VR9 или другую с ОС QNX на борту (как ее включить это отдельный рассказ, требующий целой статьи).

Вызов команды pci -vvv | less в терминале QNX показал нам, что для связи с шиной VME в нашем процессоре используется мост компании Tundra — серия UNIVERSE II. Нынче делает этот мост компания IDT. Мост ориентирован на процессоры PowerPC, но за не имением другого (ненужности шины VME) разработчикам пришлось его поставить на Intelбейзед VR9.

Погуглив по интернетам, мы поняли, что мостик этот программирует мало кто, и информации, что с ним делать нету. Компания (мы еще напишем гневное и правдивое про работу этой компании, если она срочно не пришлет нам денег), что продает процессор VR9 ничего не выкладывает на своем сайте: ни BSP под QNX, ни датащитов, короче — непорядок. 
Пришлось, скрепя сердце, отказаться от копипаста и делать дело, как всегда, самим — молотком и плоскогубцами.

Действия юного геолога покорителя тундры должны быть примерно такими:

1) Заходим на сайт IDT регистрируемся получаем аккаунт и запрашиваем доступ к их базе всяких мануалов. Доступ дадут в течении 3ех дней, если ваш имейл не похож на террористический (рекомендации по составлению правильного имейла мы даем всего за 100 баксов).

2) Закачиваем последний User’s Manual, те старые, что валяются в интернетах в открытом доступе весьма неудобны, и написанное в них уже превратилось в чушь. Ни в коем случае не берем те наброски под VxWorks и, тем более, Linux, которые лежат на офф сайте — они вас запутают окончательно, у нас то QNX, да и плата совершенно конкретная.

3) Начинаем курить мануал. Покурили, поняли, что ничего не курится и пришли в КБ13. Тут за жалких 10Кбаксов вам все закодят)) Причем 2 раза непавильно, а потом правильно) и еще бонус (доработка, чтоб совсем все работало). Велкам.
Конечно, это шутка, за такие жалкие деньги мы три раза не работаем — можем закодить только один раз (неправильно).

Всем понятно, что бессмысленно настраивать мост VME за которым ничего не стоит.
За нашим мостом стоит платка БТ62-401В (с помощью утренних медитаций и йоги мы смогли ее настроить без документации) и теперь она имеет адреса на VME: 0x8d00 16-разрядный и 0x860000 24-разрядный, данные по всем адресам идут 16-разрядные.
Если у вас другая платка, то ее адреса описаны в документации на нее (мы надеемся).

Теперь вызываем снова команду pci -vvv | less и просматриваем на какой шине висит мост Tundra Universe II — это поле bus в выводе команды pci, в нашем случае это шина номер 5.

Как 5, почему 5? Ответ на этот вопрос ищем в настройках какого-либо PCI bridge. Находим мост у которго номер подшины 5, все там же в выводе pci -vvv. И смотрим, какое адресное пространство нашего процессора настроенно на эту шину. Существует 32 разрядный регистр начала области шины PCI 5 и конца этой области. Только эти адреса дойдут до нашей тундры.

Команда pci не показывает нам базовый регистр PCI BAR0(1) моста Tundra, она просто не знает, что он там есть, у мостов их обычно нету. Но, неверь глазам своим, он там действительно есть и посмотреть его в QNX мы сможем программно. Естественно, этот адрес лежит в пределах области адресов PCI шины с номером 5.

Теперь мы скорее хотим записать и прочитать что нибудь с нашего VME устройства, напишем маленький код:

 

// незабудем include 

 unsigned int *ptr=0;
 unsigned short *ptr2=0;
 unsigned short *ptr3=0;

int main( void )
{
    int buff[100];
    int buffData[100];
    int phdl;
    unsigned int temp;

    if(ThreadCtl(_NTO_TCTL_IO, 0)==-1){
		perror(NULL);
		exit(EXIT_FAILURE);
	}	 

    phdl = pci_attach( 0 ); // подключимся к драйверу ПИСИАЙ
    if( phdl == -1 ) {
        fprintf( stderr, "PCI CONNECT ERRORn" );
        return EXIT_FAILURE;
    }

temp=pci_read_config32( 5,0x48,0x10,1,buff);
 // чтение адреса из базового регистра BAR0 т.е. по какому адресу
// биос размапил нам мост
// на VR9 включен доступ только через память поэтому
// второй BAR1 нас как-то не волнует совсем.
temp=pci_read_config32( 5,0x48,0x04,1,buff); 
// функция pci вполне может нам показать какую-то лажу почитаем сами
buff[0]= buff[0]|0x6; 
// включаем на всякий случай доступ к памяти,
// если отключен - регистры читаться не будут
temp=pci_write_config32( 5,0x48,0x04,1,buff); 

// не будем запускать мейджик фнкцию из стандарта PCI 2.1, 
//которая пишет в BAR все единички потом считывает сколько 
//ноликов не записалось
// единичками и на основании этих ноликов инвертирует там что-то
// и определяет сколько нам надо размапить памяти для общения
// выделим память для регистров тундры
ptr = mmap_device_memory( 0, 0x1000, PROT_READ|PROT_WRITE|PROT_NOCACHE,0, 0xC0000000);
if ( ptr == MAP_FAILED ) {
    perror("mmap Tundra Registers shit happens");
    exit( EXIT_FAILURE );
}
// теперь при доступе к ptr мы будем обращаться к регистрам Tundra Universe
// нас интересует доступ только с адреса 0x100 остальное
// доступно функциями pci_config_read/write

// вместо этих дефайнов четкие парни должны скопепастеть 
//часть функции типа pciAutoConfig - где же на ПИСИАЙ еще осталось место,
// но нам некогда зададим вручную

#define VME_WINDOW0_TO 0x8000
// 16 разрядный адресок нашего адаптера MilStd1553 он на самом 
//деле 0x8d00 но регистру пофигу
// на 12 младщих разрядов в этот адрес будет пететранслирован пакет с шины PCI
#define VME_WINDOW0_PCI_ADDR  0xC1000000 
// начало той области PCI в которую мы будем писать,
// а оно будет транслировано на шину VME
// мост VME при отлове этого адреса будет убирать 0xC1
// и будет засылать 0x8000 + 12 младших бит шины PCI
#define VME_WINDOW0_PCI_ADDR_LIMIT 0xC1010000
 // конец области PCI которая транслируется на VME

#define VME_WINDOW0_TO_RAM 0x00860000
// 24 разрядный адресок нашего адаптера MilStd1553  
//в этот адрес будет перетранслирован пакет с шины PCI
#define VME_WINDOW0_PCI_ADDR_RAM  0xC2000000 
// начало той области PCI в которую мы будем писать, 
//а оно будет транслировано на шину VME
#define VME_WINDOW0_PCI_ADDR_LIMIT_RAM 0xC2010000 
// конец области PCI которая транслируется на VME

// поставим в регистр Tundra Universe II LMISC 
//значение таймера CWT 64 PCI клока (откуда мы знаем сколько там 
//адрес дешефрируется на этом мега БТ62-401 в док-ии не написано...)
*(ptr+0x184/4)=0x30000000;
temp=*(ptr+0x184/4);
// запишем теперь в базовый адрес LSI0_BS нулевого окошка
*(ptr+0x104/4)=VME_WINDOW0_PCI_ADDR;
*(ptr+0x108/4)=VME_WINDOW0_PCI_ADDR_LIMIT;
*(ptr+0x10C/4)=VME_WINDOW0_TO;
*(ptr+0x100/4)=0xC0405000; 
// записью в этот регистр мы разрешаем этому окошку 
//транслировать 16 битные данные по 16 битному адресу на VME

// запишем теперь в базовый адрес LSI1_BS первого окошка
*(ptr+0x118/4)=VME_WINDOW0_PCI_ADDR_RAM;
*(ptr+0x11C/4)=VME_WINDOW0_PCI_ADDR_LIMIT_RAM;
*(ptr+0x120/4)=VME_WINDOW0_TO_RAM;
*(ptr+0x114/4)=0xC0411000; 
// записью в этот регистр мы разрешаем этому окошку
// транслировать 16 битные данные по 24 битному адресу на VME

// теперь размапим в адрес процесса кусочек шины PCI 
//ахтунг!!! он ессно не совпадает с физическим
ptr2 = mmap_device_memory(0, 0x100000,PROT_READ|PROT_WRITE|PROT_NOCACHE, 0, 0xC1000000);
if ( ptr2 == MAP_FAILED ) {
    perror("mmap A16 BT62-401V shit happens");
    exit( EXIT_FAILURE );
}
ptr3 = mmap_device_memory(0, 0x10000, PROT_READ|PROT_WRITE|PROT_NOCACHE, 0, 0xC2000000);
if ( ptr3 == MAP_FAILED ) {
    perror("mmap A24 BT62-401V shit happens");
    exit( EXIT_FAILURE );
}

// для нормальной работы здесь надо настроить работу с прерываниями
// с шины VME, но в режиме теста регистров и памяти это не надо, сделаем это далее...

ptr2=ptr2+0xd00/2; 
// добавим к указателю 0xd00 по этому адресу наше БТ62 в соответсвии
// с джамперами которые мы установили будет откликаться на свои регистры

// запустим переписанную под QNX функцию тестирования адаптера MilStd1553 4 канала.
// важно! адаптер БТ62 имеет байт ордеринг - Big Endian, что плохо...
// придется переконверчивать 

//t23401a(адреса)

    /* Закончили работать с драйвером ПИСИАЙ */
    pci_detach( phdl );
    return EXIT_SUCCESS;
}

Сперва мы хотели дать полный драйвер и рекомендации по работе с мостом Tundra Universe II, но решили, что это неправильно, четкие программеры сами должны пройти этот путь. Все преисполнились пафоса? Нет, на самом деле нам жалко и хочется денег. Из примера и так все понятно, мы лишь утаили увлекательную часть настройки цепочки прерываний VME-PCI-процессора.
Драйвер БТ62-401 мы никогда не дадим никому, чтобы вновь проектирующие системы не думали, что его вообще можно запрограммировать. И все упоминания об этой плате мы скоро удалим, чтобы не дай бог кто ею не вздумал воспользоваться.

На сегодня это все.

Похожий бред:

Программирование Tundra Universe VME моста: 11 комментариев

  1. В отечественных разработках вам все равно придется переходить на отечественный аналог юниверса — 1890ВГ5Т, и 1890ВГ12Т в недалеком будущем. Тем не менее, гратс! Смогли разобраться. Но лучше раздобудьте какой нибудь 205 или 206 модули у того же Корунда, а то старичок 401 ну совсем уж не годен для тестирования VME: слейвный тормозной модуль с режимом передачи D16, а какой процессор в 62 багете с ним используется, я и вовсе промолчу. Так что молодцы, конечно, но не обнадеживайтесь )

    • Нам приятно, что еще кто-то занимается подобным и даже нас камментит.
      А кто делает платы с отечественными мостами VME интересно…?
      И что за новые модули 205, 206? А то сами понимаете, у корунда нет рекламы, никакой…

      • Ну, можно сказать, что параллельным VME уже никто не занимается, поскольку стандарт мертв уже несколько лет как, а потолок производительности в виде 2eSST достигнут в 1890ВГ12Т. Что касается последовательной ипостаси vme, то здесь отечественная оборонка предпочла другой индустриальный интерфейс — rapidIO, используемый американцами. Так что, можно с уверенностью сказать, что новые отечественные чипы под VME врятли кто увидит.
        БТ23-205 и БТ23-206 — это давно уже не новые 🙂 модули на базе VME, с мостом 1890ВГ5Т. У Корунда должны быть каталоги, по идее. Никогда не интересовался данным вопросом )

        • Кстати, самый скорострельный мост под параллельное VME, это alma2e, производства ibm. Но при этом, ваш выбор Tundra стратегически верен, поскольку их мосты наиболее распространены в мире, и, как следствие, в интернете больше всего информации именно на них, в т.ч. и сишного кода. С другой стороны, только отечественные микросхемы будут (обязаны) работать при минус 65С 🙂

          • У ibm документация гавно)) то какие они гениальные и умные мы знаем, но заказчику нужно хоть че-нить работающее)

        • Сделали бы PCI и PCI-Express хоть какие нормальные российские, а rapidio этот куда нам? У камней и так протоколы связи гигагерцовые последовательные свои, а мастера с мастером по Expressу завязать можно, а самое главное дешево. Хотя, последовательный rapidio, да, надо бы че нить склепать на нем.

          • А чего вам не хватает под PCI? Ethernet 10/100 есть. Периферия (ATA,SATA,USB,RS232,RTC и т.д.) есть. Даже VGA есть. И все в силиконе, никаких плис.
            А вот PCI-E нет, и почти наверняка не будет, поскольку на роль индастриал интерфейса он не тянет. Да и новые известные мне (отечественные) процессоры все как один мипс.
            Я могу ошибаться только в том случае, если у нас появится хоть одна силиконовая контора, ориентированная на масс продакшн. Но конкурировать с Китаем .. врятли 🙂

        • А нам всего хватает на PCI и заказчик, слова богу, с нами солидарен, вроде как, так что скоро забудем про этот древний VME.
          Силкиновых наноконтор слава богу не будет))
          А где почитать то, что у нас российского на кристалах под PCI есть?

          • Нано контор точно не будет, потому как: военным не интересно — 0.18 практически не держит температуру и радиацию, а масспродакшн уже не дорого, а мегадорого — в РФ не окупится никогда.
            В моем же (и, по всей видимости, и вашем) случае приставка нано- не интересна по первой причине. По той же причине, тащить VME придется еще долго — интерфейс медленный, но очень надежный, в силу конструктива, электрики и частот. В общем, военные его любят. Тем не менее, я тоже надеюсь забыть эти раритеты pci и vme, так что +1.
            Читать негде. Сайт НИИСИ не обновляется, а в Корунде, по всей видимости, отдел маркетинга находится в стадии зачатия, если вообще есть. Но тщательно погуглив, вы найдете немного статей о разработках НИИСИ; институт же научный как никак, статьи, диссеры клепают. Если что то конкретное по нашему железу интересует, пишите в почту. Возможно, смогу помочь, хотя бы в общих чертах.
            Удачи )

  2. Эх, мне бы тех американцев, которые rapidIO используют. Долбаный боинг и прочая военщина хочет вме и эту чертову тундру… А даташиты что на тундру, что на марвел дискавери, писали какие-то имбецилы — кроме названий полей регистров нифига нет практически. «Догадайся, мол, сама». 🙁

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Protected by WP Anti Spam