
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.174] |
![]() |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Цитата archimed7592 @ адрес небось далеко за мегабайтом лежит? а ты в него ещё записывать чего-то пытаешься Вот это на мысли наводит ![]() А плата использует Port IO или Memory Mapped IO? И какой адрес получается при чтении из конфигурационного пространства PCI? |
![]() |
Сообщ.
#17
,
|
|
ну раз чудненько получается адрес, то наверное Memory Mapped IO
![]() |
Сообщ.
#18
,
|
|
|
Ну железо - промышленный комп с гигагерцовым пеньком. И естественно из под винды адвантековскими тестовыми утилитками плата чудненько управляется. Я раньше работал с их платами в досе - все чудно шло, но с вордовыми обменами. А с 32 битами вот с первой платой столкнулся... Добавлено Цитата cppasm @ И какой адрес получается при чтении из конфигурационного пространства PCI? Сейчас точно не скажу - но адрес недалеко, где то что то типа 0x0C00 Я говорил, что уже работал с этими платами, и с 16 разрядами все работало |
Сообщ.
#19
,
|
|
|
Вот уточнил - базовые адреса плат идут 0xC100, 0xC200 и т.д....
|
![]() |
Сообщ.
#20
,
|
|
Цитата vadymko @ насколько я понял из примеров на которые ты дал ссылку, под базовым адресом понимается порт в который ты должен писать значения, а не адрес в памяти Вот уточнил - базовые адреса плат идут 0xC100, 0xC200 и т.д.... ![]() ![]() |
Сообщ.
#21
,
|
|
|
Цитата archimed7592 @ ну раз чудненько получается адрес, то наверное Memory Mapped IO Это откуда такие выводы? Базовый адрес - это базовый адрес. Просто адрес относительно которого отсчитываются все адреса регистров устройства. Может быть как Port IO, так и Memory Mapped IO. Цитата vadymko @ Вот уточнил - базовые адреса плат идут 0xC100, 0xC200 и т.д.... Уточнил как? Это в PCI conf прописано или ты другими путями какими-то смотрел? Вообще дамп конфигурационного пространства PCI этой платы очень бы помог - многое бы прояснилось... Снять можно скажем этой утилитой: http://members.datafast.net.au/dft0802/downloads/pci32.zip Запускать из консоли как-то так: ![]() ![]() PCI32.EXE -D>pci.txt Отчёт будет в pci.txt, запости сюда, а лучше приаттач. |
![]() |
Сообщ.
#22
,
|
|
Цитата cppasm @ Это откуда такие выводы? Базовый адрес - это базовый адрес. ![]() ![]() |
Сообщ.
#23
,
|
|
|
Базовый адрес - это базовый адрес порта
![]() |
Сообщ.
#24
,
|
|
|
Цитата archimed7592 @ просто в моём понимание адрес - это адрес, а никак не порт... Ну у тя ж тоже адрес есть, хоть ты и не в памяти живёш ![]() |
Сообщ.
#25
,
|
|
|
Цитата cppasm @ Уточнил как? Это в PCI conf прописано или ты другими путями какими-то смотрел? Уточнил собственной программой ![]() Еще раз уточню чтоб вопросов в эту сторону не было - с другими платами этой серии (с теми же платами цифрового ввода/вывода) все работает, то есть и получение адреса, и вывод значений. Цитата cppasm @ Снять можно скажем этой утилитой: Как попаду к железу сниму и скину ![]() |
Сообщ.
#26
,
|
|
|
Вот кусок рабочего кода, который я использую при работе с нашими PCI-устройствами. Именно BC31, DOS.
ВАЖНО! В настройках проекта поставить Option | Compiler | Advanced code generation | Instruction set -> 80386. ![]() ![]() typedef signed char schar; typedef unsigned char byte; typedef unsigned short word; typedef unsigned long dword; dword devid = 0x11112222; // Vendor ID, Device ID dword devno = 0; // Номер устройства (если несколько) #define outportv(addr,data) _DX = (addr); _EAX = (dword)(data); asm db 0x66; asm out dx,ax; #define _inportd(addr) _DX = (addr); asm db 0x66; asm in ax,dx; #define inportv(addr,v) _DX = (addr); asm db 0x66; asm in ax,dx; v = _EAX; dword inportd(word addr) { _DX = (addr); asm db 0x66; asm in ax,dx; return _EAX; } void outportd(word addr, dword data) { _DX = addr; _EAX = data; asm db 0x66; asm out dx,ax; } //------------------------------------------------------------- // Инициализация устройства //------------------------------------------------------------- void FindDev(void) { _SI = (word) devno; _DX = (word) (devid >> 16); _CX = (word) devid; _AX = 0xB102; asm int 0x1A; if (_AH != 0) { _SI = (word) devno; _DX = (word) (devid1 >> 16); _CX = (word) devid1; _AX = 0xB102; asm int 0x1A; if (_AH != 0) { printf("Ошибка поиска устройства\n"); exit(4); } } bx = _BX; _DI = 0x10; _BX = bx; _AX = 0xB108 + 2; asm int 0x1A; if (_AH != 0) { printf("Ошибка чтения устройства\n"); exit(4); } bar10 = _ECX; base = bar10 & 0xFFFC; _DI = 0x3C; _BX = bx; _AX = 0xB108 + 0; asm int 0x1A; irq = _CL; if (irq < 8) intno = irq + 0x08; else intno = irq - 8 + 0x70; printf("BAR10 = %08lX, Base = %04X, IRQ = %d\n", bar10, base, irq); if (base == 0) exit(4); } |
Сообщ.
#27
,
|
|
|
Цитата vmp @ Сильно...typedef signed char schar; Внушает. |
Сообщ.
#28
,
|
|
|
Цитата Adil @ Цитата (vmp @ Сегодня, 12:14) typedef signed char schar; Сильно... Внушает. А что делать, если приходится писать и таскать тексты программ между 5 процессорами разных архитектур и с разной длиной слова? И у 4 разных производителей компиляторов разные понятия о типе char - где знаковый, где беззнаковый, где настраивается ключем компилятора. |
Сообщ.
#29
,
|
|
|
![]() ![]() ![]() Не подумайте чего плохого ![]() vmp шаман ![]() Отцу русской демократии помогло Цитата vmp @ ![]() ![]() #define outportv(addr,data) _DX = (addr); _EAX = (dword)(data); asm db 0x66; asm out dx,ax; #define _inportd(addr) _DX = (addr); asm db 0x66; asm in ax,dx; #define inportv(addr,v) _DX = (addr); asm db 0x66; asm in ax,dx; v = _EAX; Не знаю что не так с предыдущими примерами, или что с ними не так делал я, но прокатил только последний вариант. Код х386 стоял в принципе везде, так что на это кивать вроде нечего... Спасибо всем!!! |
Сообщ.
#30
,
|
|
|
Ну это реально мистика
![]() Вот это ![]() ![]() asm db 0x66; asm out dx,ax; ![]() ![]() asm out dx,eax; Возможно правда с моделью памяти косяк в первом варианте - она на large рассчитана (far вызов). И в чтении порта там ошибка - результат в eax возвращается, а надо dx:ax |