From aca525d3ce745d4c622b15394a92b3c946e11854 Mon Sep 17 00:00:00 2001 From: xamidev <121681048+xamidev@users.noreply.github.com> Date: Mon, 20 May 2024 21:48:48 +0200 Subject: [PATCH] Add: nonworking serial port driver implementation --- bochslog.txt | 89 ++++++++++++++++++++++---------------------- bochsrc.txt | 1 + io.h | 1 + io.s | 7 ++++ iso/boot/kernel.elf | Bin 9780 -> 10060 bytes kernel.elf | Bin 9780 -> 10060 bytes kmain.c | 2 + makefile | 2 +- os.iso | Bin 485376 -> 485376 bytes serial.c | 68 +++++++++++++++++++++++++++++++++ serial.h | 20 ++++++++++ 11 files changed, 145 insertions(+), 45 deletions(-) create mode 100644 serial.c create mode 100644 serial.h diff --git a/bochslog.txt b/bochslog.txt index 14f0b6a..4b8de77 100644 --- a/bochslog.txt +++ b/bochslog.txt @@ -44,45 +44,45 @@ 00000000000i[USBCTL] Pluggable USB devices 00000000000i[USBCTL] mouse tablet keypad keyboard floppy disk cdrom printer 00000000000i[USBCTL] hub -00000000000i[MEM0 ] allocated memory at 0x7f59fd3dc010. after alignment, vector=0x7f59fd3dd000 +00000000000i[MEM0 ] allocated memory at 0x7fb8f1ddd010. after alignment, vector=0x7fb8f1dde000 00000000000i[MEM0 ] 32.00MB 00000000000i[MEM0 ] mem block size = 0x00020000, blocks=256 00000000000i[MEM0 ] rom at 0xffff0000/65536 ('/usr/share/bochs/BIOS-bochs-legacy') 00000000000i[CPU0 ] WARNING: 3DNow! is not implemented yet ! 00000000000i[DEV ] will paste characters every 100 iodev timer ticks -00000000000i[ ] lt_dlhandle is 0x555b0a2aef10 +00000000000i[ ] lt_dlhandle is 0x5638a94a38b0 00000000000i[PLUGIN] loaded plugin libbx_soundalsa.so 00000000000i[WAVOUT] ALSA: opened default PCM output device 00000000000i[WAVOUT] changed sample rate to 44101 -00000000000i[ ] lt_dlhandle is 0x555b0aa651a0 +00000000000i[ ] lt_dlhandle is 0x5638a9c59430 00000000000i[PLUGIN] loaded plugin libbx_pci.so -00000000000i[ ] lt_dlhandle is 0x555b0a2aeff0 +00000000000i[ ] lt_dlhandle is 0x5638a94a3990 00000000000i[PLUGIN] loaded plugin libbx_pci2isa.so -00000000000i[ ] lt_dlhandle is 0x555b0a22cea0 +00000000000i[ ] lt_dlhandle is 0x5638a9421ac0 00000000000i[PLUGIN] loaded plugin libbx_usb_uhci.so -00000000000i[ ] lt_dlhandle is 0x555b0a2c91b0 +00000000000i[ ] lt_dlhandle is 0x5638a94bdfc0 00000000000i[PLUGIN] loaded plugin libbx_acpi.so -00000000000i[ ] lt_dlhandle is 0x555b0a22c2a0 +00000000000i[ ] lt_dlhandle is 0x5638a9420ec0 00000000000i[PLUGIN] loaded plugin libbx_hpet.so -00000000000i[ ] lt_dlhandle is 0x555b0aa6f950 +00000000000i[ ] lt_dlhandle is 0x5638a9c63be0 00000000000i[PLUGIN] loaded plugin libbx_cmos.so -00000000000i[ ] lt_dlhandle is 0x555b0aa70160 +00000000000i[ ] lt_dlhandle is 0x5638a9c643f0 00000000000i[PLUGIN] loaded plugin libbx_dma.so -00000000000i[ ] lt_dlhandle is 0x555b0aa70970 +00000000000i[ ] lt_dlhandle is 0x5638a9c64d60 00000000000i[PLUGIN] loaded plugin libbx_pic.so -00000000000i[ ] lt_dlhandle is 0x555b0aa71130 +00000000000i[ ] lt_dlhandle is 0x5638a9c65520 00000000000i[PLUGIN] loaded plugin libbx_pit.so -00000000000i[ ] lt_dlhandle is 0x555b0aa71b50 +00000000000i[ ] lt_dlhandle is 0x5638a9c65f40 00000000000i[PLUGIN] loaded plugin libbx_vga.so -00000000000i[ ] lt_dlhandle is 0x555b0aa93190 +00000000000i[ ] lt_dlhandle is 0x5638a9c87580 00000000000i[PLUGIN] loaded plugin libbx_floppy.so -00000000000i[ ] lt_dlhandle is 0x555b0aa939d0 +00000000000i[ ] lt_dlhandle is 0x5638a9c87dc0 00000000000i[PLUGIN] loaded plugin libbx_ioapic.so -00000000000i[ ] lt_dlhandle is 0x555b0aa941e0 +00000000000i[ ] lt_dlhandle is 0x5638a9c885d0 00000000000i[PLUGIN] loaded plugin libbx_keyboard.so -00000000000i[ ] lt_dlhandle is 0x555b0aa94ae0 +00000000000i[ ] lt_dlhandle is 0x5638a9c88ed0 00000000000i[PLUGIN] loaded plugin libbx_harddrv.so -00000000000i[ ] lt_dlhandle is 0x555b0aa96bb0 +00000000000i[ ] lt_dlhandle is 0x5638a9c8afa0 00000000000i[PLUGIN] loaded plugin libbx_pci_ide.so 00000000000i[PLUGIN] init_dev of 'pci' plugin device by virtual method 00000000000i[DEV ] i440FX PMC present at device 0, function 0 @@ -90,7 +90,7 @@ 00000000000i[DEV ] PIIX3 PCI-to-ISA bridge present at device 1, function 0 00000000000i[PLUGIN] init_dev of 'cmos' plugin device by virtual method 00000000000i[CMOS ] Using local time for initial clock -00000000000i[CMOS ] Setting initial clock to: Sun May 19 15:09:18 2024 (time0=1716124158) +00000000000i[CMOS ] Setting initial clock to: Mon May 20 21:48:15 2024 (time0=1716234495) 00000000000i[PLUGIN] init_dev of 'dma' plugin device by virtual method 00000000000i[DMA ] channel 4 used by cascade 00000000000i[PLUGIN] init_dev of 'pic' plugin device by virtual method @@ -133,7 +133,7 @@ 00000000000i[PAR ] parallel port 1 at 0x0378 irq 7 00000000000i[PLUGIN] init_dev of 'biosdev' plugin device by virtual method 00000000000i[PLUGIN] init_dev of 'serial' plugin device by virtual method -00000000000i[SER ] com1 at 0x03f8 irq 4 (mode: null) +00000000000i[SER ] com1 at 0x03f8 irq 4 (mode: file) 00000000000i[PLUGIN] init_dev of 'extfpuirq' plugin device by virtual method 00000000000i[PLUGIN] init_dev of 'gameport' plugin device by virtual method 00000000000i[PLUGIN] init_dev of 'usb_uhci' plugin device by virtual method @@ -247,28 +247,29 @@ 00000443015i[BXVGA ] VBE known Display Interface b0c0 00000443047i[BXVGA ] VBE known Display Interface b0c5 00000445690i[VBIOS ] VBE Bios $Id: vbe.c 292 2021-06-03 12:24:22Z vruppert $ -00004097883i[BIOS ] IDE time out -00716758940i[BIOS ] Booting from 07c0:0000 -00716854324i[BIOS ] int13_harddisk: function 41, unmapped device for ELDL=80 -00716857995i[BIOS ] int13_harddisk: function 08, unmapped device for ELDL=80 -00716861666i[BIOS ] *** int 15h function AX=00c0, BX=0000 not yet supported! -00842722000p[SDL2 ] >>PANIC<< User requested shutdown. -00842722000i[CPU0 ] CPU is in protected mode (active) -00842722000i[CPU0 ] CS.mode = 32 bit -00842722000i[CPU0 ] SS.mode = 32 bit -00842722000i[CPU0 ] EFER = 0x00000000 -00842722000i[CPU0 ] | EAX=0000002a EBX=0002cd80 ECX=000000f0 EDX=000003d5 -00842722000i[CPU0 ] | ESP=00067ecc EBP=00067ee0 ESI=0002ced8 EDI=0002ced9 -00842722000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf zf af pf cf -00842722000i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D -00842722000i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 -00842722000i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00842722000i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00842722000i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00842722000i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00842722000i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 -00842722000i[CPU0 ] | EIP=001004ab (001004ab) -00842722000i[CPU0 ] | CR0=0x60000011 CR2=0x00000000 -00842722000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 -00842722000i[CMOS ] Last time is 1716125000 (Sun May 19 15:23:20 2024) -00842722000i[SIM ] quit_sim called with exit code 1 +00004097906i[BIOS ] IDE time out +00685117203i[BIOS ] Booting from 07c0:0000 +00685212587i[BIOS ] int13_harddisk: function 41, unmapped device for ELDL=80 +00685216258i[BIOS ] int13_harddisk: function 08, unmapped device for ELDL=80 +00685219929i[BIOS ] *** int 15h function AX=00c0, BX=0000 not yet supported! +00867137284i[ ] Ctrl-C detected in signal handler. +00867137285i[ ] dbg: Quit +00867137285i[CPU0 ] CPU is in protected mode (active) +00867137285i[CPU0 ] CS.mode = 32 bit +00867137285i[CPU0 ] SS.mode = 32 bit +00867137285i[CPU0 ] EFER = 0x00000000 +00867137285i[CPU0 ] | EAX=0000002a EBX=0002cd80 ECX=000000f0 EDX=00000006 +00867137285i[CPU0 ] | ESP=00067ecc EBP=00067ee0 ESI=0002ced8 EDI=0002ced9 +00867137285i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf zf af pf cf +00867137285i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D +00867137285i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 +00867137285i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00867137285i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00867137285i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00867137285i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00867137285i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00867137285i[CPU0 ] | EIP=001006cb (001006cb) +00867137285i[CPU0 ] | CR0=0x60000011 CR2=0x00000000 +00867137285i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 +00867137285i[CMOS ] Last time is 1716235362 (Mon May 20 22:02:42 2024) +00867137285i[SIM ] quit_sim called with exit code 0 diff --git a/bochsrc.txt b/bochsrc.txt index 362f256..fe783a2 100644 --- a/bochsrc.txt +++ b/bochsrc.txt @@ -7,3 +7,4 @@ boot: cdrom log: bochslog.txt clock: sync=realtime, time0=local cpu: count=1, ips=1000000 +com1: enabled=1, mode=file, dev=com1.out diff --git a/io.h b/io.h index 1ad2ff3..17894e6 100644 --- a/io.h +++ b/io.h @@ -2,5 +2,6 @@ #define INCLUDE_IO_H void outb(unsigned short port, unsigned char data); +unsigned char inb(unsigned short port); #endif diff --git a/io.s b/io.s index 8ee142f..1cac568 100644 --- a/io.s +++ b/io.s @@ -5,3 +5,10 @@ outb: mov dx, [esp + 4] out dx, al ret + +global inb + +inb: + mov dx, [esp + 4] + in al, dx + ret diff --git a/iso/boot/kernel.elf b/iso/boot/kernel.elf index 85511f93eeccdeff49642c58508bbb6722ae0989..db82abfcc5cf29e81be5a5ea4751021849c802b7 100755 GIT binary patch delta 2114 zcmah~e{54#6u$5E$GTG1$F|NPlg+k^aY5Kn1fwxv)?`tJ&18|7klH~@i(QA^#)iqL z^MNu31h@%76T=@uKq7I(W#bPeNQYB_Wa3X^oJxjyN;QKtgpR@UJMXPqH!wEY?)|>= zednBa?tN|V$_uOZ7F!3*5_^I%R$ac&=`^p&Wo%9E$>&eoR~|Mq)|t3vXG|#-7?YE> z-SS&ERn@CpHUJJta?-L<*exH_xFaTw>-Jc>*N%UcsPDS^lAJ75d|HxE_;Shp>VR&u z_j_&zKUXaFzB9<+4Sf$`w0&||ZBy5RBBoz-qjuzR)J_)kJxl9WhJO3KS5I?8Jb%j22nF9X$? zXqm-WcfF;e|<_mi)xqX%nWs138nac#x|U@Y4AUMp+R&>)?e;w zeNM0W3|V(&tnvHSJaRvyk&LS|#*ELT^=hMXZ|E+%1izJKP94wbR?eZJ&cs~u(qug& znAZqBp&0in9TPTvC z{Y>jc*^?6Fj+9~Z6_-AoP#_X%vNpv0n*-Kppv~IW6pO598q0!QE_91a()`21M;uaG zRXtR9MV@85_}pw$wQT6%R|{R@LuqbxIK_CHFLcZo52pDlEXUJ4>To(;W2(9!+Z8%z zGvfZ1fE&l(qA{q8DhQTf$}1or&6bNvON@$5nON49zB8qG`sV@k8_U3{7*EhF+KU>3LRb!^lol z4biUuNfd(S189!UC?+1#s-4_-+{}ftLu)BaA0xZ2R$&!;PR!E?;Ai#C#Q*DRHFkGj ztQ*P1YiT3th(Yhe_B_5#^^cLg#{VuWjkg0DC7l&m4%kCFbE&;y> z95G3ZMoICLSXIN6z7N<|DWPMW7_+cXvGz_>%@+;q66pnrEyfCeoc)Z=F$i>n!2SSc zXh_Fq_9vim%D`>_AI{R#O-iG|OhfrN$0wnGA3QZ!3|xhV>0Aj{5*8&ks^Pf6mV)S+ z>`-L2z`w#kXG4ZpfR|@Yzz6&-3eeT2_y*vQvKndx_F#f+AybI!RR)_t-^s`4Fn!{;eOV&sSfGI+6BsK6ga2@wME6mM-SlA!oJDjgS7>+hD z9s1TaMT6lDt+9Zwv1xsvk>7HzTzpR`5{?Ggx=6quyVusx8Vm+_jjPl)VQY(pTLL`j zDqnU_o(6yGdSA@n63C#!W3-_)gcb*kk4!-Sf>f{GKAd z$L-9eo6=i^1LrHs3it)L&3p>XsUkk?c3Ow99YS!2$gSmHv3JP-FY?fiTL1t6 delta 1078 zcmYk5Ur1AN6vxlK`|F&$cXLhCmFwq$~;GGi$Ckn|)r?cXw% z#|MclM0@HF3ZXAyky!~P5oJD9AS4VNp%fC#bvr-rG%wpd=W~AF@A>_?_r9xnS{2DO zjcG+V004#ZZAsEM=>eMb6UV28L%mvno|!)aKs1#D2*u3(p|;a*I ztZqe%)rI*sK_6uJ6_46h3|+L9o|zT&rY{)o(YAFKGp5=1J6j{IksChQ*cz^vwLe*t zP)v;0FvT>UwR;=^e=yi#YUymg=r^_dyG&gjox$^fqYjyGh~u0iZyT>T=%Q_@yFTB z53r^jRFmX=O(~=7@5xg?)WVwLV~MB|)1RjFA-yl^rG*wuxN^EX2(_YG<-h=a#8YG| zrDy{V`YEnx{__B_*((BV60Bf^A&P^^t~Oo+Pnez)p@bsyPf@%^jciaLX`H+`GfDNGwsqVT!EbcZz#>kvu9dQ;cjcfQLA-H_0OD+3z{|*<)gUBk|4c z{%1I_P@$L>a3v|oB2J?nvx%4?hnRh5>|*QAB{uFjfkI+7!rmUHFCi|&C8+@I?sgn@ zpU|EQ`kOIJ&cS1{jHB|m{0Q59^4fYJ`-oX5`i3|66S32S!E#qRKJ%FM?1%^LIPa14 wLzE8Laor=C#wi^q-8hF*?&}mUeJQDAx8PcCwk{|El%h4yt$W}GxXN1n1Ai3kumAu6 diff --git a/kernel.elf b/kernel.elf index 85511f93eeccdeff49642c58508bbb6722ae0989..db82abfcc5cf29e81be5a5ea4751021849c802b7 100755 GIT binary patch delta 2114 zcmah~e{54#6u$5E$GTG1$F|NPlg+k^aY5Kn1fwxv)?`tJ&18|7klH~@i(QA^#)iqL z^MNu31h@%76T=@uKq7I(W#bPeNQYB_Wa3X^oJxjyN;QKtgpR@UJMXPqH!wEY?)|>= zednBa?tN|V$_uOZ7F!3*5_^I%R$ac&=`^p&Wo%9E$>&eoR~|Mq)|t3vXG|#-7?YE> z-SS&ERn@CpHUJJta?-L<*exH_xFaTw>-Jc>*N%UcsPDS^lAJ75d|HxE_;Shp>VR&u z_j_&zKUXaFzB9<+4Sf$`w0&||ZBy5RBBoz-qjuzR)J_)kJxl9WhJO3KS5I?8Jb%j22nF9X$? zXqm-WcfF;e|<_mi)xqX%nWs138nac#x|U@Y4AUMp+R&>)?e;w zeNM0W3|V(&tnvHSJaRvyk&LS|#*ELT^=hMXZ|E+%1izJKP94wbR?eZJ&cs~u(qug& znAZqBp&0in9TPTvC z{Y>jc*^?6Fj+9~Z6_-AoP#_X%vNpv0n*-Kppv~IW6pO598q0!QE_91a()`21M;uaG zRXtR9MV@85_}pw$wQT6%R|{R@LuqbxIK_CHFLcZo52pDlEXUJ4>To(;W2(9!+Z8%z zGvfZ1fE&l(qA{q8DhQTf$}1or&6bNvON@$5nON49zB8qG`sV@k8_U3{7*EhF+KU>3LRb!^lol z4biUuNfd(S189!UC?+1#s-4_-+{}ftLu)BaA0xZ2R$&!;PR!E?;Ai#C#Q*DRHFkGj ztQ*P1YiT3th(Yhe_B_5#^^cLg#{VuWjkg0DC7l&m4%kCFbE&;y> z95G3ZMoICLSXIN6z7N<|DWPMW7_+cXvGz_>%@+;q66pnrEyfCeoc)Z=F$i>n!2SSc zXh_Fq_9vim%D`>_AI{R#O-iG|OhfrN$0wnGA3QZ!3|xhV>0Aj{5*8&ks^Pf6mV)S+ z>`-L2z`w#kXG4ZpfR|@Yzz6&-3eeT2_y*vQvKndx_F#f+AybI!RR)_t-^s`4Fn!{;eOV&sSfGI+6BsK6ga2@wME6mM-SlA!oJDjgS7>+hD z9s1TaMT6lDt+9Zwv1xsvk>7HzTzpR`5{?Ggx=6quyVusx8Vm+_jjPl)VQY(pTLL`j zDqnU_o(6yGdSA@n63C#!W3-_)gcb*kk4!-Sf>f{GKAd z$L-9eo6=i^1LrHs3it)L&3p>XsUkk?c3Ow99YS!2$gSmHv3JP-FY?fiTL1t6 delta 1078 zcmYk5Ur1AN6vxlK`|F&$cXLhCmFwq$~;GGi$Ckn|)r?cXw% z#|MclM0@HF3ZXAyky!~P5oJD9AS4VNp%fC#bvr-rG%wpd=W~AF@A>_?_r9xnS{2DO zjcG+V004#ZZAsEM=>eMb6UV28L%mvno|!)aKs1#D2*u3(p|;a*I ztZqe%)rI*sK_6uJ6_46h3|+L9o|zT&rY{)o(YAFKGp5=1J6j{IksChQ*cz^vwLe*t zP)v;0FvT>UwR;=^e=yi#YUymg=r^_dyG&gjox$^fqYjyGh~u0iZyT>T=%Q_@yFTB z53r^jRFmX=O(~=7@5xg?)WVwLV~MB|)1RjFA-yl^rG*wuxN^EX2(_YG<-h=a#8YG| zrDy{V`YEnx{__B_*((BV60Bf^A&P^^t~Oo+Pnez)p@bsyPf@%^jciaLX`H+`GfDNGwsqVT!EbcZz#>kvu9dQ;cjcfQLA-H_0OD+3z{|*<)gUBk|4c z{%1I_P@$L>a3v|oB2J?nvx%4?hnRh5>|*QAB{uFjfkI+7!rmUHFCi|&C8+@I?sgn@ zpU|EQ`kOIJ&cS1{jHB|m{0Q59^4fYJ`-oX5`i3|66S32S!E#qRKJ%FM?1%^LIPa14 wLzE8Laor=C#wi^q-8hF*?&}mUeJQDAx8PcCwk{|El%h4yt$W}GxXN1n1Ai3kumAu6 diff --git a/kmain.c b/kmain.c index ad503d5..b808037 100644 --- a/kmain.c +++ b/kmain.c @@ -1,8 +1,10 @@ #include "stdio.h" +#include "serial.h" int kmain(int retvalue) { clear(); puts("hello\nbrave\nnew\nworld"); + serial_write("hello", 1); return retvalue; } diff --git a/makefile b/makefile index 446ffe8..1559535 100644 --- a/makefile +++ b/makefile @@ -1,4 +1,4 @@ -OBJECTS = loader.o kmain.o stdio.o io.o string.o +OBJECTS = loader.o kmain.o stdio.o io.o string.o serial.o CC = gcc CFLAGS = -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -nostartfiles -nodefaultlibs -Wall -Wextra -c LDFLAGS = -T link.ld -melf_i386 diff --git a/os.iso b/os.iso index 373e266038b25355364a0d8979babe51d242d37e..eee9753aeedec904939dbf20a4615d612a7e68e4 100644 GIT binary patch delta 2478 zcmah~e@s(X6u$4aeUw^h1!4X`VTds^P72Con_1LQV>Z~3$;OtDTBNmgP+S4QWm@qm z0a3Hq#ES}Z$#gP=twaONx8C|;BEog|bioTumUMmlD*-PM_@0{;D z=k%QW+HHYZ+XAzEi-hS}rmW1xIholelNQXyrtGN0n4duc(osj<(j#t>E_sqBR1gaxs5k zGZ-0a@3PC-A{c8g7ek8?UB)Cy4yc>U=C@z%xynuR=>~WsSqvp}=d!d$n#LE$5>g!7 z`)VUSZOA*q6H@QLXCNe)!Vw~b^m~NucSW%vcufUxz$k>Y8@N3}i{v}1k$lZ&ZF9-! zd4EyU%{PV6)SyL5a)K>uq3LS}WSybceAnI|)EavFAVq=W2XF`5$8s7R-=k;$7<(LZ ztL*@?Vgfrpb(lEM-XQUhOyoU0 z*V>!cq^tk&OGgN^2_a+fZDbu|t6J$?PjnQi;H&pnPa>qbNZV}I+nb6;>`mrj7{`dv zr!w^7G#uMt9RsSh zQDIc4k$Tl*xesI&UWeaOqx*-?nI1d~4b}UnqZTJ?z5(;PfuE3i3W8fAGRdVc2wtCn zb&n?s5{PHZ_?&qJvXWa%qF}8mHUYS93`)k8r}45!I&abL8PT zY~|&Zx>C1wlTGKc)#_?1-Q{IO@)A1}T4_4X4ztf&>AXZ^SQO1zd3l_6CtWdFlPjpU zu$!%P4xJTdx;C0dJz=)6jn1YmVfH$n9bx7If7+b;qPRdQb)40!;VLJCZxsGA?jt{G zKH_AU_Hy74EBQ1e2~xp_Yn<|c-GRK^MfQ9feTFUgm?m?7vHUhV({mESqYp%}Mk$9* zX~kJT*2EN7fs;Qfia8TF8)b^b83m3NI4@7&R4F+4>eP+Tvql<=GEpv&cK=Tz2XH4uALq(!8kr@a$C%Vllr=5N)EuU$VTMrl*yIbqZv#IzI1O+nG>n@?Y(h+pWLUx;jw}I(?{SBem66*s`wD zWp}Qxaoa2vm1VXHcCUlxWjzrqce-q3UAfKbeo|LjW4GJbs^c_8AJNsioz*sGKThZ7 zJdvr?T2p3mTdQr+M9wNpwcF~ds&H0Y>`r^7#a6MgdNbQ~oDNYR&o*?@**xyRm&EpV z(zIB-F(;E?@oafJO<>=4QayhPe5aDw5X5x>umccpq)gXEzlrt18wEdU#K5j~(V3c1 j8X=cixC_3kzD{Sezn~Wye6+!*YVfHWe45XE{HcEd3)t|) delta 1454 zcmYjRZ%i9y7=Q2S^?G#W?trdtP%M^;fspLVAOV@i5#YnzCUaxX4@6c6VWxqE58@J& z!EUQ4&NOt%TaW?ErXliY*O-7G%mgc1KDcy7Cm+;giA$Q$n4xAdDOjJk*Ur9a`#itr z{r!H=`{%C1@$%t#xqeXF?``rns7>BRRTb;hx_Y%CR|p-|O2r)bykGnC5MLrWgwVOw zM!rNYC=Si8KEIbG;=AVjKn6ox%oUQ>+714hHK)OUXRWg&pO}?JxC&uB_PRmtiuokg zg?UO2lgP~Cu23@8?#V9?lM^H}PSjViSXFPBg-&ne^$@w-(jr`oFdonKi2ICY(f9?H zSVJ$}V@njdQ1`tvxWueZv}WXpB3y%TX>)m#+oxM^@d~NOmbD)09tF41EfCTztQ;AI zJ96V?o{*8~KQbYSJscrg(sorl|93jwkytk&{6-mT6UVxCHlm&HKRl@=?TM2a!FTjj z7(85zUI;^3>w-bmlHyx(-;W3qlSV~eX?rX$ui`{U-%qT5$*2c&mRgce{D3uc3*8KZ zYMElWO{Ve$9I*Hhj70C#wh0(7_#SZP1&I*)APoDJxV%id*rF0Q*hCSPCZK{=Pl7D? zS>YG@;v{TYhHy_K(JiWe4EHV5cnD_6MhmClptCpF8~mWvBleD+^6-B!CoQQYjx)*~ z`o*(w8`vu#vbM!wB1??VDWnb~)30D0#d(9zk*^UG z>}O!%B3VcL2pi@EcM)IC6Ko=Oqv3Uo%FD@XEC6ppA#2vFnOyEMy-a z=$DIN6WCE-v(vka_*W3dJZz_rF}LcN>&VqP>Ry6x3siiK_MnGEx0j&I>~|B=M2l`i jrTLReLf&JJPtlIsphuK_TtJ6_ZVKppKsSG?3t#*P_Z?3o diff --git a/serial.c b/serial.c new file mode 100644 index 0000000..2df309b --- /dev/null +++ b/serial.c @@ -0,0 +1,68 @@ +#include "io.h" +#include "serial.h" + +void serial_configure_baud_rate(unsigned short com, unsigned short divisor) +{ + outb(SERIAL_LINE_CMD_PORT(com), SERIAL_LINE_ENABLE_DLAB); + outb(SERIAL_DATA_PORT(com), (divisor >> 8) & 0x00FF); + outb(SERIAL_DATA_PORT(com), divisor & 0x00FF); +} + +void serial_configure_line(unsigned short com) +{ + /* + d b p s dl + 0 0 000 0 11 = 0x03 + + Length 8 bits, no parity bit, one stop bit, break control off + */ + + outb(SERIAL_LINE_CMD_PORT(com), 0x03); +} + +void serial_configure_buffer(unsigned short com) +{ + /* + lv b r d c c e + 11 0 0 0 1 1 1 = 0xC7 + + Enable FIFO, clear FIFO queues, use 14 bytes as queue size + */ + + outb(SERIAL_LINE_CMD_PORT(com), 0xC7); +} + +void serial_configure_modem(unsigned short com) +{ + /* + + r r a l a a r d + 0 0 0 0 0 0 1 1 = 0x03 + + Ready to transmit, data terminal ready + */ + + outb(SERIAL_LINE_CMD_PORT(com), 0x03); +} + +int serial_is_transmit_fifo_empty(unsigned short com) +{ + return (inb(SERIAL_LINE_STATUS_PORT(com)) & 0x20); +} + +void serial_write(const char* buf, unsigned short com) +{ + serial_configure_baud_rate(com, 2); + serial_configure_line(com); + serial_configure_buffer(com); + serial_configure_modem(com); + + for (unsigned int i = 0; i