Support serial UART without FIFO. Patch from EluanCM.
This commit is contained in:
parent
1181b13c2d
commit
dcf354688d
6 changed files with 24 additions and 20 deletions
|
|
@ -312,8 +312,8 @@ void common_init()
|
|||
lpt_init();
|
||||
pic_init();
|
||||
pit_init();
|
||||
serial1_init(0x3f8, 4);
|
||||
serial2_init(0x2f8, 3);
|
||||
serial1_init(0x3f8, 4, 1);
|
||||
serial2_init(0x2f8, 3, 1);
|
||||
}
|
||||
|
||||
void xt_init()
|
||||
|
|
@ -343,7 +343,7 @@ void pcjr_init()
|
|||
pic_init();
|
||||
pit_init();
|
||||
pit_set_out_func(&pit, 0, pit_irq0_timer_pcjr);
|
||||
serial1_init(0x2f8, 3);
|
||||
serial1_init(0x2f8, 3, 1);
|
||||
keyboard_pcjr_init();
|
||||
device_add(&sn76489_device);
|
||||
nmi_mask = 0x80;
|
||||
|
|
@ -427,7 +427,7 @@ void xt_zenith_init() /* [8088] Zenith Data Systems SupersPort */
|
|||
lpt2_remove(); /* only one parallel port */
|
||||
pic_init();
|
||||
pit_init();
|
||||
serial1_init(0x3f8, 4); /* only one serial port */
|
||||
serial1_init(0x3f8, 4, 1); /* only one serial port */
|
||||
mem_add_bios();
|
||||
device_add(&zenith_scratchpad_device);
|
||||
pit_set_out_func(&pit, 1, pit_refresh_timer_xt);
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ void ps1_write(uint16_t port, uint8_t val, void *p)
|
|||
case 0x102:
|
||||
lpt1_remove();
|
||||
if (val & 0x04)
|
||||
serial1_init(0x3f8, 4);
|
||||
serial1_init(0x3f8, 4, 1);
|
||||
else
|
||||
serial1_remove();
|
||||
if (val & 0x10)
|
||||
|
|
@ -238,7 +238,7 @@ void ps1_m2121_write(uint16_t port, uint8_t val, void *p)
|
|||
case 0x102:
|
||||
lpt1_remove();
|
||||
if (val & 0x04)
|
||||
serial1_init(0x3f8, 4);
|
||||
serial1_init(0x3f8, 4, 1);
|
||||
else
|
||||
serial1_remove();
|
||||
if (val & 0x10)
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ void ps2_write(uint16_t port, uint8_t val, void *p)
|
|||
case 0x102:
|
||||
lpt1_remove();
|
||||
if (val & 0x04)
|
||||
serial1_init(0x3f8, 4);
|
||||
serial1_init(0x3f8, 4, 1);
|
||||
else
|
||||
serial1_remove();
|
||||
if (val & 0x10)
|
||||
|
|
|
|||
|
|
@ -315,9 +315,9 @@ static void model_50_write(uint16_t port, uint8_t val)
|
|||
if (val & 0x04)
|
||||
{
|
||||
if (val & 0x08)
|
||||
serial1_init(0x3f8, 4);
|
||||
serial1_init(0x3f8, 4, 1);
|
||||
else
|
||||
serial1_init(0x2f8, 3);
|
||||
serial1_init(0x2f8, 3, 1);
|
||||
}
|
||||
else
|
||||
serial1_remove();
|
||||
|
|
@ -371,9 +371,9 @@ static void model_55sx_write(uint16_t port, uint8_t val)
|
|||
if (val & 0x04)
|
||||
{
|
||||
if (val & 0x08)
|
||||
serial1_init(0x3f8, 4);
|
||||
serial1_init(0x3f8, 4, 1);
|
||||
else
|
||||
serial1_init(0x2f8, 3);
|
||||
serial1_init(0x2f8, 3, 1);
|
||||
}
|
||||
else
|
||||
serial1_remove();
|
||||
|
|
@ -445,9 +445,9 @@ static void model_70_type3_write(uint16_t port, uint8_t val)
|
|||
if (val & 0x04)
|
||||
{
|
||||
if (val & 0x08)
|
||||
serial1_init(0x3f8, 4);
|
||||
serial1_init(0x3f8, 4, 1);
|
||||
else
|
||||
serial1_init(0x2f8, 3);
|
||||
serial1_init(0x2f8, 3, 1);
|
||||
}
|
||||
else
|
||||
serial1_remove();
|
||||
|
|
@ -494,9 +494,9 @@ static void model_80_write(uint16_t port, uint8_t val)
|
|||
if (val & 0x04)
|
||||
{
|
||||
if (val & 0x08)
|
||||
serial1_init(0x3f8, 4);
|
||||
serial1_init(0x3f8, 4, 1);
|
||||
else
|
||||
serial1_init(0x2f8, 3);
|
||||
serial1_init(0x2f8, 3, 1);
|
||||
}
|
||||
else
|
||||
serial1_remove();
|
||||
|
|
|
|||
|
|
@ -111,7 +111,8 @@ void serial_write(uint16_t addr, uint8_t val, void *p)
|
|||
serial_update_ints(serial);
|
||||
break;
|
||||
case 2:
|
||||
serial->fcr = val;
|
||||
if (serial->has_fifo)
|
||||
serial->fcr = val;
|
||||
break;
|
||||
case 3:
|
||||
serial->lcr = val;
|
||||
|
|
@ -247,7 +248,7 @@ void serial_receive_callback(void *p)
|
|||
}
|
||||
|
||||
/*Tandy might need COM1 at 2f8*/
|
||||
void serial1_init(uint16_t addr, int irq)
|
||||
void serial1_init(uint16_t addr, int irq, int has_fifo)
|
||||
{
|
||||
memset(&serial1, 0, sizeof(serial1));
|
||||
io_sethandler(addr, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial1);
|
||||
|
|
@ -255,6 +256,7 @@ void serial1_init(uint16_t addr, int irq)
|
|||
serial1.addr = addr;
|
||||
serial1.rcr_callback = NULL;
|
||||
timer_add(&serial1.receive_timer, serial_receive_callback, &serial1, 0);
|
||||
serial1.has_fifo = has_fifo;
|
||||
}
|
||||
void serial1_set(uint16_t addr, int irq)
|
||||
{
|
||||
|
|
@ -268,7 +270,7 @@ void serial1_remove()
|
|||
io_removehandler(serial1.addr, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial1);
|
||||
}
|
||||
|
||||
void serial2_init(uint16_t addr, int irq)
|
||||
void serial2_init(uint16_t addr, int irq, int has_fifo)
|
||||
{
|
||||
memset(&serial2, 0, sizeof(serial2));
|
||||
io_sethandler(addr, 0x0008, serial_read, NULL, NULL, serial_write, NULL, NULL, &serial2);
|
||||
|
|
@ -276,6 +278,7 @@ void serial2_init(uint16_t addr, int irq)
|
|||
serial2.addr = addr;
|
||||
serial2.rcr_callback = NULL;
|
||||
timer_add(&serial2.receive_timer, serial_receive_callback, &serial2, 0);
|
||||
serial2.has_fifo = has_fifo;
|
||||
}
|
||||
void serial2_set(uint16_t addr, int irq)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#include "timer.h"
|
||||
|
||||
void serial1_init(uint16_t addr, int irq);
|
||||
void serial2_init(uint16_t addr, int irq);
|
||||
void serial1_init(uint16_t addr, int irq, int has_fifo);
|
||||
void serial2_init(uint16_t addr, int irq, int has_fifo);
|
||||
void serial1_set(uint16_t addr, int irq);
|
||||
void serial2_set(uint16_t addr, int irq);
|
||||
void serial1_remove();
|
||||
|
|
@ -26,6 +26,7 @@ typedef struct
|
|||
void *rcr_callback_p;
|
||||
uint8_t fifo[256];
|
||||
int fifo_read, fifo_write;
|
||||
int has_fifo;
|
||||
|
||||
pc_timer_t receive_timer;
|
||||
} SERIAL;
|
||||
|
|
|
|||
Loading…
Reference in a new issue