"Железный" вопрос.

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
all ex
Сообщения: 2
Зарегистрирован: 23 июн 2009, 01:45

Возникла необходимость "вмешаться" в "нормальную, т.е.штатную работу ноутбука, а точнее, в работу SUPER I/O чипа FDC37N958FR. Ноут - DELL Latitude 500CPx. Для чего это нужно? Дело в том, что этот девайс содержит ДВА полноценных UART, но на один из них (UART2) посажен инфракрасный порт. Так вот этот порт надо сделать "обычным" СОМ2 портом. В BIOS SETUP этого сделать нельзя )-;!
Но ведь если нельзя, но ооочень хочется - то можно. А хочется очень.
При первом прочтении DataCheet на камень показалось, что ничего страшного нет. Вот кусок программы, переводящий UART2 в режим обычного, не IR COM порта:

INDEX_PORT EQU 03F0H
DATA_PORT EQU INDEX_PORT+1
CONF_STATE = 55H
RUN_STATE = 0AAH

DSEG ENDS
CSEG SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CSEG,DS:DSEG,SS:STCK

ENTRY PROC FAR

PUSH DS ;сохранить для выхода
SUB AX,AX ;из программы
PUSH AX ;в DOS
MOV AX,DSEG ;инициировать адрес
MOV DS,AX ;сегмента данных


MOV DX,INDEX_PORT ;переводим камень в режим
MOV AX,CONF_STATE
OUT DX,AX ;конфигурирования
MOV AX,7H ;выбираем логическое устройство
OUT DX,AX
MOV AX,5H ;СОМ2
INC DX
oUT DX,AX
MOV AX,30H ;активизируем
DEC DX
OUT DX,AX
MOV AX,1H ;его
INC DX
OUT DX,AX

MOV AX,0F0H ;здесь переводим
DEC DX ;его в нормальный
OUT DX,AX ;
MOV AX,0 ;СОМ режим
INC DX
OUT DX,AX
MOV AX,0F1H
DEC DX
OUT DX,AX
MOV AX,0
INC DX
OUT DX,AX
MOV AX,60H ;а здеся задаём
DEC DX
OUT DX,AX
MOV AX,2H ;BASE I/O ADDRESS
INC DX
OUT DX,AX
MOV AX,61H
DEC DX
OUT DX,AX
MOV AX,0F8H ;2F8h
INC DX
OUT DX,AX
MOV AX,62H ;сюда
DEC DX ;
OUT DX,AX ;пишется
MOV AX,0 ;
INC DX ;BASE
OUT DX,AX ;I/O
MOV AX,63H ;ADDRESS
DEC DX ;
OUT DX,AX ;для
MOV AX,0 ;
INC DX ;InfraRed
OUT DX,AX ;порта

MOV DX,INDEX_PORT ;выходим из
MOV AX,RUN_STATE ;режима
OUT DX,AX ;конфигурирования


RET ;возврат управления DOS
ENTRY ENDP ;
CSEG ENDS
END ENTRY

Всё просто, НО!!!
Но сигналов на ногах чипа нЕТУ! А чтобы он появился, надо тоже записать в Multiplexing register определённое значение. Но дело в том, что адрес его - четырёхбайтовый.(7FXXh). При более глубоком вникании в документацию выяснилось, что есть ещё т.н.ACCSESS.bus И Mailbox. Вот через них то и происходит взаимодействие внедрённого 8051 c памятью. Есть в доке и инструкции для MASM51. Но это, как я понимаю, нужно при первоначальном программировании микроконтроллера.
Меня же интересует взаимодействие с ним из среды DOS 6.22 с помощью TASM2.0.
Короче. Что-то я запутался с этим. Может у кого есть какие свежие мысли по этому поводу? Буду очень признателен.

PS. DataCheet на камень: http://www.datasheetcatalog.com/datashe ... 58FR.shtml
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

&quot писал(а):Но дело в том, что адрес его - четырёхбайтовый
Почему четырех, если двухбайтовый. Самый обыкновенный порт 7F3D - 7F40.
&quot писал(а):При более глубоком вникании в документацию выяснилось, что есть ещё т.н.ACCSESS.bus И Mailbox. Вот через них то и происходит взаимодействие внедрённого 8051 c памятью.
С какой именно памятью? Внутренним буффером приема или памятью ПК посредством DMA? У таких контроллеров обычно есть свой буффер приема, и если он заполняется - то вырабатывается прерывание, в котором прикладная программа скачивает с него данные и очищает. Так же обязательно есть DIRECT режим, в котором данные можно получить текущее логическое состояние пинов COM порта напрямую. Т.е. получается в зависимости от задачи, мы сами задаем ему режим работы. Какое количество данных за единицу времени вам нужно получить? и что требуется от этого порта, какова задача в целом.
It's a long way to the top if you wanna rock'n'roll
all ex
Сообщения: 2
Зарегистрирован: 23 июн 2009, 01:45

Здравствуйте.
Задача в целом - получить на ноутбуке второй СОМ порт.
Точнее - TxD, RxD от него. Остальные - не нужны.
Эти сигналы должны присутствовать на ногах GPIO8,GPIO9 SUPER I/O.
GPIO - это их "нормальное" состояние. А TxD и RxD - альтернативное. Так вот, чтобы перевести их в такое состояние и нужен доступ к Multiplexing_1 Register. 8051(встроенный в SUPER I/O), обращается к нему по адресу 7F3D,
а вот как записать туда нужную информацию?(в DataCheet написано следующее:"Host - N/A, 8051 - 0x7F3D).
Да, к ногам чипа я подключился, поставил MAX232, осталось включить это
всё на программном уровне.
Сам порт СОМ2 в системе присутствует и функционирует. Checkit3.0 его видит, внутренний тест проходит "на ура", а с тестовой заглушкой - не проходят Test Data Register и Test Line Control.
Ответить