Вс окт 28, 2012 16:48:38
Пн окт 29, 2012 12:20:37
Пн окт 29, 2012 21:09:59
shame писал(а):Пока что получил цирроз мозга в попытке понять как работать с портами. С АВР и ПИКами все проще, там порт - группа ног выведеных наружу, как оно сделано в х86? Где прочитать? Кого спросить?
Вт окт 30, 2012 08:31:01
Rokl писал(а):Для обычных проциков, что х86, что 8080,8085,Z80,MC6800 и т.д. сделаны отдельные контроллеры портов ввода/вывода: К580ВВ55, MC6821, Z80PIO.
Вт окт 30, 2012 21:25:39
shame писал(а):...а заюзать его именно как контроллер занимающийся дрыгоножеством, не имитируя стандартные прерывания и ОС. К примеру сделать на нем дупликатор EEPROM.
Ср окт 31, 2012 09:01:36
Пт ноя 02, 2012 06:36:11
А Вы уверены, что он поймёт в каких конкретно "старших адресах" должна быть ПЗУ ?
Надо сначала спросить самого T.S. , понял ли он, как надо подключить ПЗУ, чтоб оно было в самом "верху" первого мегабайта, и почему именно стартовый адрес равен 0FFFF0h в архитектуре x86-ых.
Кстати если он захочет съэкономить "нижний" килобайт ОЗУ и - что важно - не писать самому на ассемблере обработку прерываний, то ему придётся наглухо запретить прерывания и вообще их не использовать.
Кстати у меня тоже есть похожий процессор, даже несколько интереснее - NEC_V25 .
А тогда для начала попробуй на ассемблере написать начальную загрузку своего контроллера...т.е. как в биосе писюка старшие 256 байт с межсегментными безусловными переходами, настройками внутренних регистров процессора, потом назначь вершину стека и настрой регистры управления внешних портов ввода вывода. Главное написать этот кусок кода со старшими адресами процессора. Т.е. твоя программа должна физически находиться и работать в ПЗУ в старших адресах проца, где ПЗУ биоса у писюков находится, ну а вершину стека должен назначить в ОЗУ соответственно.
start:
mov dx,80h ;Регистр управления встроенным UART
mov al,15h
out dx,al ; 8N1 прием/передача разрешены
mov dx,88h ; Регистр делителя частоты UART
mov al, 40h ; 40*1000000 МГц / 19200 baud / 32
out dx,al ; 19200 baud
.1:
mov dx, 82h ; Serial port status
in al,dx
test al,20h ; THRE is empty - все передано, буфер пуст
jz .1
mov al,38h ; Цифра 8 в ASCII
mov dx,84h ; Регистр передачи
out dx,al ; write character
jmp .1
Пт ноя 02, 2012 11:36:03
Пт ноя 02, 2012 11:47:24
ChipKiller писал(а):посмотрите здесь http://www.kmitl.ac.th/~kswichit/C188/c188sbc.htm
Пт ноя 02, 2012 17:10:55
Пт ноя 02, 2012 23:34:32
mov dx,88h ; Регистр делителя частоты UART
Вт ноя 06, 2012 07:16:22
Pe3ucTop писал(а):Может не в кассу, но:
1) совет - используйте что-то типа POST 80 или просто регистр с адресом 80 и вывод на светодиоды.. Сразу будет видно работает или нет.. (вроде есть у вас вывод в 80 порт, но про результат вы ничего не упомянули)
2) Мне казалось что серийник надо инициализировать болеет подробно (и таймеры) , хотя в данном вопросе могу ошибатся
3) а не попробовать ли в начале отключить прерывания ??
4) не знаю почему, но я бы советовал ljmp ...
И, о том, как и с помошью чего делают биос советую посмотреть : coreboot.org
petrenko писал(а):Ну да. делитель частоты должен делить, но откуда взять ту самую частоту, чтоб делить то ?Похоже, что не все настройки таймера и UART выполнены. Проверьте ещё раз, во все ли управляющие регистры этих устройств Вы занесли нужные байтики.
Вт ноя 06, 2012 08:28:05
Pe3ucTop писал(а):4) не знаю почему, но я бы советовал ljmp ...
Вт ноя 06, 2012 15:54:00
JMP SHORT label 11101011 diff L
JMP NEAR label 11101001 diff L diff H
JMP NEAR r16/m16 11111111 md 100 r/m
JMP FAR label 11101010 IP-L IP-H CS-L CS-H
JMP FAR m32 11111111 md 101 r/m
ES to CU Software
Consideration
n Some Peripheral Control Block registers are different
! Refer to <<Am186EM/ER/ES/ED/CU Peripheral Control Block
Register Map Comparison>>
n Peripheral Control Block (PCB) of CU is bigger than ES
! 1 Kbyte vs. 256 byte
! Offset of PCB registers are different
- тоже принять во внимание надо..n UART
! DCE/DTE hardware flow control protocol no longer
available (affected when using external modem)
! UART of CU can also be driven from the UART clock input
(UCLK), as well as derived from CPU clock
n UZI# pin not available on CU
n CLKOUTB pin not available on CU
Ср ноя 07, 2012 05:21:03
petrenko писал(а):Насчёт команд перехода - в x86 существуют следующие :JMP SHORT label 11101011 diff L
JMP NEAR label 11101001 diff L diff H
JMP NEAR r16/m16 11111111 md 100 r/m
JMP FAR label 11101010 IP-L IP-H CS-L CS-H
JMP FAR m32 11111111 md 101 r/m
В каком "дэйтащиите" Вы пытались искать ljmp и где выискали sjmp из набора команд совершенно другого процессора и кто Вам эту чепуху наподсказывал ? (вопрос риторический )
"дэйтащиит" надо "курить" осторожно - чтоб не обкуриться
petrenko писал(а):Далее, при внимательном прочтении (или "курении"- это кому как нравится ) "дэйтащиит"-а можно разглядеть следующее уточнение :ES to CU Software
...<overquotting skipped>
Это различие надо учитывать в программировании, я так понимаю..
И ещё есть там уточнения :
...<overquotting skipped>
- тоже принять во внимание надо..
petrenko писал(а):И если Вы уверены таки, что верно занесли все нужные значения в регистры устройств, то может есть у Вас возможность посмотреть осциллографом частоту на выходе таймера и формы сигналов на выходе uart - возможно это развеет сомнения..
Удачи в Ваших развлечениях с Am186er !
Ср ноя 07, 2012 12:33:53
shame писал(а):Pe3ucTop писал(а):4) не знаю почему, но я бы советовал ljmp ...
ljmp в х86 не нашел... а coreboot ориентированы всеж на 32 бита...
Ср ноя 07, 2012 14:14:14
- Извиняюсь за дезинформацию, имел в виду "JMP FAR" , (long jump - словами) и никак не конкретную комманду..
- coreboot - начальная инициализация 16 бит и без всяких защишенных режимов и т.д. , как в старые добрые времена.
- POST 80 - опять таки не имел в виду в прямом понимании, а как подход, подключится к I/O адресному пространству и выводить в коде в это пространство, и смотреть работает lи вывод. Но для этого нужен декодер адреса и I/O (наверно излишне).
- Глянул немного мануал :
-- при старте WatchDog - включен и его надо или отключить или дергать:
-- может для начала просто GPIO подергать, а не UART.
-- и ещё проверте NMI не отключаемое прерывание.
-- и попробуйте запустить проц с внешнего источника частоты (oscillator) и без внутреннего PLL (в режиме /2).
Что есть в данном случае "начальный режим"?Пока всё, хотя вопросов куча: схема, подключение, начальный режим, и т.д. и т.п.
Ср ноя 07, 2012 14:38:23
.section ".reset"
.code16
.globl reset_vector
reset_vector:
.byte 0xe9
.int _start - ( . + 2 )
/* Note: The above jump is hand coded to work around bugs in binutils.
* 5 byte are used for a 3 byte instruction. This works because x86
* is little endian and allows us to use supported 32bit relocations
* instead of the weird 16 bit relocations that binutils does not
* handle consistenly between versions because they are used so rarely.
*/
. = 0x8;
.code32
jmp protected_start
.previous
/*
* This software and ancillary information (herein called SOFTWARE)
* called LinuxBIOS is made available under the terms described here.
*
* The SOFTWARE has been approved for release with associated
* LA-CC Number 00-34. Unless otherwise indicated, this SOFTWARE has
* been authored by an employee or employees of the University of
* California, operator of the Los Alamos National Laboratory under
* Contract No. W-7405-ENG-36 with the U.S. Department of Energy.
*
* The U.S. Government has rights to use, reproduce, and distribute this
* SOFTWARE. The public may copy, distribute, prepare derivative works
* and publicly display this SOFTWARE without charge, provided that this
* Notice and any statement of authorship are reproduced on all copies.
*
* Neither the Government nor the University makes any warranty, express
* or implied, or assumes any liability or responsibility for the use of
* this SOFTWARE. If SOFTWARE is modified to produce derivative works,
* such modified SOFTWARE should be clearly marked, so as not to confuse
* it with the version available from LANL.
*
* Copyright (C) 2000, Ron Minnich rminnich@lanl.gov
* Advanced Computing Lab, LANL
*/
/* Start code to put an i386 or later processor into 32-bit protected mode.
*/
#include <arch/rom_segs.h>
.code16
.globl _start
.type _start, @function
_start:
cli
/* Save the BIST result */
movl %eax, %ebp
post_code(POST_RESET_VECTOR_CORRECT)
/* IMMEDIATELY invalidate the translation lookaside buffer (TLB) before
* executing any further code. Even though paging is disabled we
* could still get false address translations due to the TLB if we
* didn't invalidate it. Thanks to kmliu@sis.com.tw for this TLB fix.
*/
xorl %eax, %eax
movl %eax, %cr3 /* Invalidate TLB*/
/* Invalidating the cache here seems to be a bad idea on
* modern processors. Don't.
* If we are hyperthreaded or we have multiple cores it is bad,
* for SMP startup. On Opterons it causes a 5 second delay.
* Invalidating the cache was pure paranoia in any event.
* If you cpu needs it you can write a cpu dependent version of
* entry16.inc.
*/
/* Note: gas handles memory addresses in 16 bit code very poorly.
* In particular it doesn't appear to have a directive allowing you
* associate a section or even an absolute offset with a segment register.
*
* This means that anything except cs:ip relative offsets are
* a real pain in 16 bit mode. And explains why it is almost
* impossible to get gas to do lgdt correctly.
*
* One way to work around this is to have the linker do the
* math instead of the assembler. This solves the very
* pratical problem of being able to write code that can
* be relocated.
*
* An lgdt call before we have memory enabled cannot be
* position independent, as we cannot execute a call
* instruction to get our current instruction pointer.
* So while this code is relocateable it isn't arbitrarily
* relocatable.
*
* The criteria for relocation have been relaxed to their
* utmost, so that we can use the same code for both
* our initial entry point and startup of the second cpu.
* The code assumes when executing at _start that:
* (((cs & 0xfff) == 0) and (ip == _start & 0xffff))
* or
* ((cs == anything) and (ip == 0)).
*
* The restrictions in reset16.inc mean that _start initially
* must be loaded at or above 0xffff0000 or below 0x100000.
*
* The linker scripts computes gdtptr16_offset by simply returning
* the low 16 bits. This means that the intial segment used
* when start is called must be 64K aligned. This should not
* restrict the address as the ip address can be anything.
*
* Also load an IDT with NULL limit to prevent the 16bit IDT being used
* in protected mode before c_start.S sets up a 32bit IDT when entering
* ram stage. In practise: CPU will shutdown on any exception.
* See IA32 manual Vol 3A 19.26 Interrupts.
*/
movw %cs, %ax
shlw $4, %ax
movw $nullidt_offset, %bx
subw %ax, %bx
lidt %cs:(%bx)
movw $gdtptr16_offset, %bx
subw %ax, %bx
data32 lgdt %cs:(%bx)
movl %cr0, %eax
andl $0x7FFAFFD1, %eax /* PG,AM,WP,NE,TS,EM,MP = 0 */
orl $0x60000001, %eax /* CD, NW, PE = 1 */
movl %eax, %cr0
/* Restore BIST to %eax */
movl %ebp, %eax
/* Now that we are in protected mode jump to a 32 bit code segment. */
data32 ljmp $ROM_CODE_SEG, $__protected_start
/**
* The gdt is defined in entry32.inc, it has a 4 Gb code segment
* at 0x08, and a 4 GB data segment at 0x10;
*/
.align 4
.globl gdtptr16
gdtptr16:
.word gdt_end - gdt -1 /* compute the table limit */
.long gdt /* we know the offset */
.align 4
.globl nullidt
nullidt:
.word 0 /* limit */
.long 0
.word 0
.globl _estart
_estart:
.code32
Ср ноя 07, 2012 19:28:15
Чт ноя 08, 2012 00:18:49
shame писал(а): ...- Глянул немного мануал :
-- при старте WatchDog - включен и его надо или отключить или дергать:
стр.54 The WDT is inactive after reset. Проверено в железе. Действительно, WDT не работает если его не включить.
...