uart: WTF
authorBernhard Urban <lewurm@gmail.com>
Mon, 10 Jan 2011 23:44:39 +0000 (00:44 +0100)
committerBernhard Urban <lewurm@gmail.com>
Mon, 10 Jan 2011 23:44:39 +0000 (00:44 +0100)
(shell1) $ /dev/ttyUSB0 >! /tmp/dump
(shell2) $ echo "12345678" > /dev/ttyUSB0
(shell1) STRG+C
(shell1) $ xdd /tmp/dump # hexeditor...
         0000000: 31a6 a235 d3c2 0a

erwarteter wert:
0000000: 3132 3334 3536 3738

blaaah....

2_isa/src/bootrom.s
3_test/uartint.s
cpu/src/extension_uart_b.vhd
cpu/src/extension_uart_pkg.vhd
cpu/src/rom_b.vhd

index d38e1854527f517791893b82811e21e057a93780..3f596c5ca0d54c69307bf6853b7f7a8d5eef2f14 100644 (file)
@@ -112,6 +112,8 @@ bootrom:
 bt_H:
        ldi r1, 0x4f ; 'O'
        call send_byte
+       xor r1, r1, r1
+       ldi r1, 0x41 ; 'A'
        call send_byte
        br bootrom
 
index 8f4975eebbe06db9bc908fdba30de49b61b67729..8c62b030897dd79b2f9ac3242c3eb6e752a6a21e 100644 (file)
@@ -1,73 +1,19 @@
 .text
 start:
        br+ main ;br+ 
-       call+ uartrdy ;call+ 0x80(128, 128)
+       call+ uartrdy
        ret
 main:
+       ldi r0, 0x2000 ; status...
        ldi r1, 0x200b ;ldi r1, 8203
        ldi r2, 0x200c ;ldi r2, 8204
-       ldi r3, 0x2010 ;ldi r3, 8208
-       ldi r4, 0x2024 ;ldi r4, 8228
-       ldi r5, 3
-       stw r5, 0(r4)
-       br+ start
-       ; stwnv r5, 0(r4)
+       ; ldi r4, 0x2024 ;ldi r4, 8228
+       ; ldi r5, 3 ; enable interrupts
+       ; stw r5, 0(r4)
+       ldw r5, 0(r0)
+       andx r5, 0x2
+       brzs+ main
 uartrdy:
        ldw r7, 0(r2)
-       xor r10, r10, r10
-       ldi r10, 0x41
-       stw r10, 0(r1) ;TODO: remove plz, kkthx
-       ; load instructions into ram
-       ldi r8, 0x2034 ; paddr
-       ldi r9, 0x2038 ; pdata
-       xor r10, r10, r10
-       xor r11, r11, r11
-
-       ; place this small program into instr-ram:
-       ;.text
-       ;start:
-       ;       br+ main
-       ;       call+ main
-       ;       ret
-       ;main:
-       ;       stw r7, 0(r1)
-       ;halt:
-       ;       br+ halt
-
-       ;eb000183;br+ main;;
-       ldi r10, 0
-       stw r10, 0(r8)
-       ldi r11, 0x0183
-       ldih r11, 0xeb00
-       stw r11, 0(r9)
-       ;eb000107;call+ main;;
-       xor r10, r10, r10
-       ldi r10, 1
-       stw r10, 0(r8)
-       ldi r11, 0x107
-       ldih r11, 0xeb00
-       stw r11, 0(r9)
-       ;eb000008;ret;;
-       xor r10, r10, r10
-       ldi r10, 2
-       stw r10, 0(r8)
-       ldi r11, 0x8
-       ldih r11, 0xeb00
-       stw r11, 0(r9)
-       ;e7b88000;stw r7, 0(r1);;
-       xor r10, r10, r10
-       ldi r10, 4
-       stw r10, 0(r8)
-       ldi r11, 0x8000
-       ldih r11, 0xe7b8
-       stw r11, 0(r9)
-       ;eb000003;br+ halt;;
-       xor r10, r10, r10
-       ldi r10, 5
-       stw r10, 0(r8)
-       ldi r11, 0x3
-       ldih r11, 0xeb00
-       stw r11, 0(r9)
-
-leave:
-       ; just run and run, until we leave ROM and enter
+       stw r7, 0(r1)
+       br main
index 09cec401b335ea2bcb8f1767de17d7faee7d5857..b50506955c8cb5137895d041fecfd3cae3912137 100644 (file)
@@ -69,7 +69,7 @@ begin
    if (reset = RESET_VALUE) then
                        w1_st_co <= (others=>'0');
                        w2_uart_config(31 downto 16) <= (others=>'0');
-                       w2_uart_config(15 downto 0) <= std_logic_vector(to_unsigned(CLK_PER_BAUD, 16)); -- x"0822"; -- x"01B2";
+                       w2_uart_config(15 downto 0) <= x"01b2"; -- std_logic_vector(to_unsigned(CLK_PER_BAUD, 16)); -- x"0822"; -- x"01B2";
                        w3_uart_send <= (others=>'0');
                        w4_uart_receive <= (others=>'0');
                        tx_rdy_int <= '0';
index a7f14d9442c611e0b4820308107ec3409b31afba..fdb7893d7185593df197b8a8e51a02f88ed71bae 100644 (file)
@@ -22,8 +22,8 @@ subtype baud_rate_l is std_logic_vector(BAUD_RATE_WIDTH-1 downto 0);
 --constant CLK_FREQ_MHZ : real := 33.33;
 --constant BAUD_RATE : integer := 115200;
 --constant CLK_PER_BAUD : integer := integer((CLK_FREQ_MHZ * 1000000.0) / real(BAUD_RATE) - 0.5);
--- constant CLK_PER_BAUD : integer := 434;
-constant CLK_PER_BAUD : integer := 2083; -- @uni, bei 20MHz und 9600 Baud
+constant CLK_PER_BAUD : integer := 434;
+-- constant CLK_PER_BAUD : integer := 2083; -- @uni, bei 20MHz und 9600 Baud
 -- constant CLK_PER_BAUD : integer := 50; -- @modelsim
 
  component extension_uart is
index b75c7d43590fbd377bedc7db8dc7967bac42be8b..a0acce488ea9a45ef8b0e6e6a92a5ec85a62ca77 100644 (file)
@@ -123,101 +123,18 @@ begin
 --                             when "00000000111" => data_out <= x"e7a00004";
 --                             when "00000001000" => data_out <= x"e7280004";
 --                     --      when "00000001001" => data_out <= x"eb7ffb81";
-       when "0000000" => data_out <= x"eb000183"; -- br+ main
-       when "0000001" => data_out <= x"eb000103"; -- br+ main
+       when "0000000" => data_out <= x"eb000183"; -- br+ main 
+       when "0000001" => data_out <= x"eb000407"; -- call+ uartrdy
        when "0000010" => data_out <= x"eb000008"; -- ret
-       when "0000011" => data_out <= x"ed510000"; -- ldi r10, UART_BASE@lo
-       when "0000100" => data_out <= x"ed500002"; -- ldih r10, UART_BASE@hi
-       when "0000101" => data_out <= x"ed590180"; -- ldi r11, PBASE@lo
-       when "0000110" => data_out <= x"ed580002"; -- ldih r11, PBASE@hi
-       when "0000111" => data_out <= x"eb000985"; -- call recv_byte
-       when "0001000" => data_out <= x"e4088800"; -- xor r1, r1, r1
-       when "0001001" => data_out <= x"ec800240"; -- cmpi r0, 0x48 
-       when "0001010" => data_out <= x"1b001983"; -- breq+ bt_H
-       when "0001011" => data_out <= x"eb7ffe01"; -- br poll 
-       when "0001100" => data_out <= x"e71d0000"; -- ldw r3, UART_STATUS(r10)
-       when "0001101" => data_out <= x"e2980008"; -- andx r3, UART_TRANS_EMPTY
-       when "0001110" => data_out <= x"0b7fff03"; -- brnz+ send_byte 
-       when "0001111" => data_out <= x"e78d0008"; -- stw r1, UART_TRANS(r10)
-       when "0010000" => data_out <= x"eb000008"; -- ret
-       when "0010001" => data_out <= x"e5008008"; -- lrs r0, r1, 0
-       when "0010010" => data_out <= x"eb7ffd05"; -- call send_byte
-       when "0010011" => data_out <= x"e500a008"; -- lrs r0, r1, 8
-       when "0010100" => data_out <= x"eb7ffc05"; -- call send_byte
-       when "0010101" => data_out <= x"e500c008"; -- lrs r0, r1, 16
-       when "0010110" => data_out <= x"eb7ffb05"; -- call send_byte
-       when "0010111" => data_out <= x"e500e008"; -- lrs r0, r1, 24
-       when "0011000" => data_out <= x"eb7ffa05"; -- call send_byte
-       when "0011001" => data_out <= x"eb000008"; -- ret
-       when "0011010" => data_out <= x"e71d0000"; -- ldw r3, UART_STATUS(r10)
-       when "0011011" => data_out <= x"e2980010"; -- andx r3, UART_RECV_NEW
-       when "0011100" => data_out <= x"1b7fff03"; -- brzs+ recv_byte
-       when "0011101" => data_out <= x"e4000000"; -- xor r0, r0, r0
-       when "0011110" => data_out <= x"e705000c"; -- ldw r0, UART_RECV(r10)
-       when "0011111" => data_out <= x"eb000008"; -- ret
-       when "0100000" => data_out <= x"e4088800"; -- xor r1, r1, r1
-       when "0100001" => data_out <= x"eb7ffc85"; -- call recv_byte
-       when "0100010" => data_out <= x"e3080800"; -- or r1, r0, r1
-       when "0100011" => data_out <= x"eb7ffb85"; -- call recv_byte
-       when "0100100" => data_out <= x"e508a000"; -- lls r1, r1, 8
-       when "0100101" => data_out <= x"e3080800"; -- or r1, r0, r1
-       when "0100110" => data_out <= x"eb7ffa05"; -- call recv_byte
-       when "0100111" => data_out <= x"e508a000"; -- lls r1, r1, 8
-       when "0101000" => data_out <= x"e3080800"; -- or r1, r0, r1
-       when "0101001" => data_out <= x"eb7ff885"; -- call recv_byte
-       when "0101010" => data_out <= x"e508a000"; -- lls r1, r1, 8
-       when "0101011" => data_out <= x"e3080800"; -- or r1, r0, r1
-       when "0101100" => data_out <= x"e1008000"; -- addi r0, r1, 0
-       when "0101101" => data_out <= x"eb000008"; -- ret
-       when "0101110" => data_out <= x"eb7ff605"; -- call recv_byte
-       when "0101111" => data_out <= x"ed080280"; -- ldi r1, 0x50 
-       when "0110000" => data_out <= x"eb7fee05"; -- call send_byte
-       when "0110001" => data_out <= x"eb001701"; -- br tehend
-       when "0110010" => data_out <= x"e4088800"; -- xor r1, r1, r1
-       when "0110011" => data_out <= x"ec8002b8"; -- cmpi r0, 0x57 
-       when "0110100" => data_out <= x"1b000681"; -- breq- bt_W
-       when "0110101" => data_out <= x"ec800290"; -- cmpi r0, 0x52 
-       when "0110110" => data_out <= x"1b000901"; -- breq- bt_R
-       when "0110111" => data_out <= x"ec800288"; -- cmpi r0, 0x51 
-       when "0111000" => data_out <= x"1b000b81"; -- breq- bt_Q
-       when "0111001" => data_out <= x"ec8002a0"; -- cmpi r0, 0x54 
-       when "0111010" => data_out <= x"1b000e01"; -- breq- bt_T
-       when "0111011" => data_out <= x"ec800250"; -- cmpi r0, 0x4a 
-       when "0111100" => data_out <= x"1b001081"; -- breq- bt_J
-       when "0111101" => data_out <= x"ed080278"; -- ldi r1, 0x4f 
-       when "0111110" => data_out <= x"eb7fe705"; -- call send_byte
-       when "0111111" => data_out <= x"eb7fe685"; -- call send_byte
-       when "1000000" => data_out <= x"eb7ff701"; -- br bootrom
-       when "1000001" => data_out <= x"eb7fef85"; -- call recv_word 
-       when "1000010" => data_out <= x"e7858004"; -- stw r0, PADDR(r11)
-       when "1000011" => data_out <= x"eb7fee85"; -- call recv_word 
-       when "1000100" => data_out <= x"e7858008"; -- stw r0, PDATA(r11)
-       when "1000101" => data_out <= x"ed080220"; -- ldi r1, 0x44 
-       when "1000110" => data_out <= x"eb7fe305"; -- call send_byte
-       when "1000111" => data_out <= x"eb7ff381"; -- br bootrom
-       when "1001000" => data_out <= x"eb7fec05"; -- call recv_word 
-       when "1001001" => data_out <= x"e1100000"; -- mov r2, r0
-       when "1001010" => data_out <= x"ed080230"; -- ldi r1, 0x46 
-       when "1001011" => data_out <= x"eb7fe085"; -- call send_byte
-       when "1001100" => data_out <= x"ea090000"; -- ldx r1, 0(r2)
-       when "1001101" => data_out <= x"eb7fe205"; -- call send_word
-       when "1001110" => data_out <= x"eb7ff001"; -- br bootrom
-       when "1001111" => data_out <= x"eb7fe885"; -- call recv_word 
-       when "1010000" => data_out <= x"e1300000"; -- mov r6, r0
-       when "1010001" => data_out <= x"eb7fe785"; -- call recv_word 
-       when "1010010" => data_out <= x"e7830000"; -- stw r0, 0(r6)
-       when "1010011" => data_out <= x"ed080208"; -- ldi r1, 0x41 
-       when "1010100" => data_out <= x"eb7fdc05"; -- call send_byte
-       when "1010101" => data_out <= x"eb7fec81"; -- br bootrom
-       when "1010110" => data_out <= x"eb7fe505"; -- call recv_word 
-       when "1010111" => data_out <= x"e1100000"; -- mov r2, r0
-       when "1011000" => data_out <= x"ed080238"; -- ldi r1, 0x47 
-       when "1011001" => data_out <= x"eb7fd985"; -- call send_byte
-       when "1011010" => data_out <= x"e7090000"; -- ldw r1, 0(r2)
-       when "1011011" => data_out <= x"eb7fdb05"; -- call send_word
-       when "1011100" => data_out <= x"eb7fe901"; -- br bootrom
-       when "1011101" => data_out <= x"eb7fe185"; -- call recv_word
-       when "1011110" => data_out <= x"eb800000"; -- brr r0
+       when "0000011" => data_out <= x"ed010000"; -- ldi r0, 0x2000 
+       when "0000100" => data_out <= x"ed090058"; -- ldi r1, 0x200b 
+       when "0000101" => data_out <= x"ed110060"; -- ldi r2, 0x200c 
+       when "0000110" => data_out <= x"e7280000"; -- ldw r5, 0(r0)
+       when "0000111" => data_out <= x"e2a80010"; -- andx r5, 0x2
+       when "0001000" => data_out <= x"1b7ffd83"; -- brzs+ main
+       when "0001001" => data_out <= x"e7390000"; -- ldw r7, 0(r2)
+       when "0001010" => data_out <= x"e7b88000"; -- stw r7, 0(r1)
+       when "0001011" => data_out <= x"eb7ffc01"; -- br main
        -- just nop until rom end!
        when others => data_out <= x"fd000000";
                        end case;