From 7e2c6a53445a6d87ab11b62a44915e533cb39590 Mon Sep 17 00:00:00 2001 From: SarahW Date: Thu, 15 Oct 2020 21:51:58 +0100 Subject: [PATCH] Add DDC/plug and play monitor support to S3 ViRGE. --- src/vid_ddc.c | 6 ++++++ src/vid_ddc.o | Bin 5308 -> 0 bytes src/vid_s3_virge.c | 37 ++++++++++++++++++++++++++++++++++--- 3 files changed, 40 insertions(+), 3 deletions(-) delete mode 100644 src/vid_ddc.o diff --git a/src/vid_ddc.c b/src/vid_ddc.c index 78e40c4..c06613c 100644 --- a/src/vid_ddc.c +++ b/src/vid_ddc.c @@ -251,6 +251,12 @@ void ddc_i2c_change(int new_clock, int new_data) case I2C_TRANSMIT_START: if (!i2c.clock && new_clock) i2c.state = I2C_TRANSMIT; + if (i2c.clock && new_clock && !i2c.last_data && new_data) /*Stop bit*/ + { +// pclog("Stop bit received\n"); + i2c.state = I2C_IDLE; + prom_stop(); + } case I2C_TRANSMIT: if (!i2c.clock && new_clock) { diff --git a/src/vid_ddc.o b/src/vid_ddc.o deleted file mode 100644 index 4b52766d6a34a8a5b93bf4b2e961a75337efd08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5308 zcmcJTe{7pa8OQH+;?$I+Z#7ymAQ5hBZLMhCIIAZV)G1xtWoVnonvMAm-J-@AM6xu3q*k7^qPg%i3Eost^0uxX5$l2z2>7h<<2MDxd0I)PVE z^c)W-<7V7ZZW27v%|BA<7vJDmxeCq;WDoO2rtB5xV?{=P{S3gFcx+PlKZ zoRKg`4W$b4aDx!7svD~km8L|tMLsVS7}#F$WM#6#r@Hv@(J zTaegLY7LbSg_=udsIh!Bv{`>{$tOg)h4NNH(}=~ic@KnUkX0SI->R4$)}mhA2u~x` z$n{rO5K6Lqsf~)4qCtwcZl-u?`jva}M)GdNFOiWl8bo7--vkz>M}?hVj!OF#{mjDD zHET&PJ_9d`*Y#pvdP9}1s$R5^vKB{vUT&d|M3zd?R=lUbq7`nO)@Ms#QEH>Csg@Ap ze@x9xzkCm=tN!cOn@Cv|y?7PxIjjU!puUoH3_a0jWld4F7R`pqs#b2J7L>Vzg%1NI znbxgVlr78tTJZ8A`1Q!hXUkEVSADixQvOxZlQZ*$d0(jox|qY_vzx2EbsP29cKTWP zL!CZ_cezb=8mS73V#KXq;{7Ul9I2L~*X#6*=|#te>W3#V^P7lBi6+GpWxmsSvTA=uSu6|gk97$G zP0mHUBa4OoK{8Ohc`+1g%QBqW;I)to>;j(}{H> z$OoFv+7&2MuTTEv_T-0W&CM6&Aj*YPqd}Owq3N^Niq%pZEi&`-Y7bndH6^Is%l;r@ zS|97~huS#os2WsG)u2UCi&Hmdp^52VQ+$rLqho)bBL}B@mJ1(fqn{}J$ETmE=(Cjt z-rwhFw>!!|QTl7)-S-MNgP8KCkkzMWq@#WMvY(3j{8_0kOQ(JQoSkZyd33~5$u5~P z?NpCUjo7KOI1yFI`=O1%OjY>M{kbFuScSxF&o{`e&#*jX{CFJu@ zAnEgeL&m2Ni>pg-o>MBNspS%rq;8RGvdj=Jv-=UG--Y<5vw?{nH zx}WIvY6l)W{NSSpdXFAH;>k+S9p|X{3j7tMb@YS((h>NY?9|BQv{>QCZWIN3(zD_GHdF&DHa~ zt=03qjm3wC;`u>O*K+Y8XxK;H2M=}zcRrRH?miaIh z(8iAlZ6ct3rn#|k3VSmMjefT1T;D>`!A;Fa3JuTteA$h^UD(w42=1htA$Q>kA%FGy zN!n37`=H6o44CW;;7LMz7jJQ3Q^4{)*y8uS{TiARblB2Wvq@}Y+6f|CO@ex&avx_p z#`JZj1QVUlss^34ioVPAGp2c_D$^f9^mEcA-eTe8Rx0;?=GghnRYNmnYx*dG8s%crjtyknVx6*9@BZI zi%j!OZ!q0rYQ)Vz`P|I(Nu~~_BTO+SgDD46GdRZDDW(~wA2a=m={2U;nf}1^H;}S? zleJq+A2DsfI#>PJ#uQrk9y6GF@W2!t{Hl z8%+OZ+JG&pJpDA&E~dRqQKko&uw?{&{58q5L=jyI6_Hg%wA&TYnWTt50u<31q9|z7 z7IBE_Nv1SYxG$A9kfLxK*O`88G?k1clZkLbiFW)c`>lzf@L~U~4Y5>*tU#V(it)s< z_-VF_DTNZdYz50%mctnc3StbUWtmGJx4V>HD92fG{sTa+G-!t~j&6UQU;nZ#Z4xEj z!TIGcJ=EwtbqD8HKO8_?LBupO_2B&Cha)I+n9O+sox&98SD-=LA$e^yU<>qzL4#IA zOs%>Do!n>bIiS7?L6_Opay}8mrH<4rMF>#ri&(u3>EFRqS7P!O=TxZ7_g!U3Iqy+^ z>QZ9%P0e9h-O-$Fsq2|TAr0-d vi$TQPmwOTGuHVq%4`0betbXHNWp(FtrLwM+YEs@>ZCtHVzk8xaJt6)Jh1MFf diff --git a/src/vid_s3_virge.c b/src/vid_s3_virge.c index 60afc23..562842d 100644 --- a/src/vid_s3_virge.c +++ b/src/vid_s3_virge.c @@ -8,6 +8,7 @@ #include "rom.h" #include "thread.h" #include "video.h" +#include "vid_ddc.h" #include "vid_s3_virge.h" #include "vid_svga.h" #include "vid_svga_render.h" @@ -235,6 +236,8 @@ typedef struct virge_t int virge_busy; uint8_t subsys_stat, subsys_cntl; + + uint8_t serialport; } virge_t; static inline void wake_fifo_thread(virge_t *virge) @@ -306,6 +309,11 @@ enum #define INT_3DF_EMP (1 << 6) #define INT_MASK 0xff +#define SERIAL_PORT_SCW (1 << 0) +#define SERIAL_PORT_SDW (1 << 1) +#define SERIAL_PORT_SCR (1 << 2) +#define SERIAL_PORT_SDR (1 << 3) + static void s3_virge_update_irqs(virge_t *virge) { if ((virge->svga.crtc[0x32] & 0x10) && (virge->subsys_stat & virge->subsys_cntl & INT_MASK)) @@ -786,6 +794,14 @@ static uint8_t s3_virge_mmio_read(uint32_t addr, void *p) case 0x83d8: case 0x83d9: case 0x83da: case 0x83db: case 0x83dc: case 0x83dd: case 0x83de: case 0x83df: return s3_virge_in(addr & 0x3ff, p); + + case 0xff20: case 0xff21: + ret = virge->serialport & ~(SERIAL_PORT_SCR | SERIAL_PORT_SDR); + if ((virge->serialport & SERIAL_PORT_SCW) && ddc_read_clock()) + ret |= SERIAL_PORT_SCR; + if ((virge->serialport & SERIAL_PORT_SDW) && ddc_read_data()) + ret |= SERIAL_PORT_SDR; + return ret; } return 0xff; } @@ -1355,9 +1371,12 @@ static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *p) case 0x83dc: case 0x83dd: case 0x83de: case 0x83df: s3_virge_out(addr & 0x3ff, val, p); break; - } - + case 0xff20: + virge->serialport = val; + ddc_i2c_change((val & SERIAL_PORT_SCW) ? 1 : 0, (val & SERIAL_PORT_SDW) ? 1 : 0); + break; + } } static void s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *p) { @@ -1374,6 +1393,10 @@ static void s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *p) s3_virge_mmio_write(addr, val, p); s3_virge_mmio_write(addr + 1, val >> 8, p); break; + + case 0xff20: + s3_virge_mmio_write(addr, val, p); + break; } } static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p) @@ -1817,6 +1840,10 @@ static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *p) // s3_virge_triangle(virge); break; + + case 0xff20: + s3_virge_mmio_write(addr, val, p); + break; } } @@ -3916,6 +3943,8 @@ static void *s3_virge_init() virge->fifo_not_full_event = thread_create_event(); virge->fifo_thread = thread_create(fifo_thread, virge); + ddc_init(); + return virge; } @@ -4012,7 +4041,9 @@ static void *s3_virge_375_init() virge->wake_fifo_thread = thread_create_event(); virge->fifo_not_full_event = thread_create_event(); virge->fifo_thread = thread_create(fifo_thread, virge); - + + ddc_init(); + return virge; }