mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 16:12:44 +00:00 
			
		
		
		
	Kernel: Let's say that IO::delay(N) delays for N microseconds
Supposedly that's how much delay you get when doing I/O on port 0x80.
This commit is contained in:
		
							parent
							
								
									85aafe492d
								
							
						
					
					
						commit
						03eb0e5638
					
				
					 3 changed files with 5 additions and 11 deletions
				
			
		|  | @ -100,7 +100,7 @@ void SB16::initialize() | |||
|     disable_irq(); | ||||
| 
 | ||||
|     IO::out8(0x226, 1); | ||||
|     IO::delay(); | ||||
|     IO::delay(32); | ||||
|     IO::out8(0x226, 0); | ||||
| 
 | ||||
|     auto data = dsp_read(); | ||||
|  |  | |||
|  | @ -215,20 +215,16 @@ void enable(u32 cpu) | |||
|     write_register(APIC_REG_TPR, 0); | ||||
| 
 | ||||
|     if (cpu != 0) { | ||||
|         static volatile u32 foo = 0; | ||||
| 
 | ||||
|         // INIT
 | ||||
|         write_icr(ICRReg(0, ICRReg::INIT, ICRReg::Physical, ICRReg::Assert, ICRReg::TriggerMode::Edge, ICRReg::AllExcludingSelf)); | ||||
| 
 | ||||
|         for (foo = 0; foo < 0x800000; foo++) | ||||
|             ; // TODO: 10 millisecond delay
 | ||||
|         IO::delay(10 * 1000); | ||||
| 
 | ||||
|         for (int i = 0; i < 2; i++) { | ||||
|             // SIPI
 | ||||
|             write_icr(ICRReg(0x08, ICRReg::StartUp, ICRReg::Physical, ICRReg::Assert, ICRReg::TriggerMode::Edge, ICRReg::AllExcludingSelf)); // start execution at P8000
 | ||||
| 
 | ||||
|             for (foo = 0; foo < 0x80000; foo++) | ||||
|                 ; // TODO: 200 microsecond delay
 | ||||
|             IO::delay(200); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -94,12 +94,10 @@ inline void repeated_out16(u16 port, const u16* data, int data_size) | |||
|                  : "d"(port)); | ||||
| } | ||||
| 
 | ||||
| inline void delay() | ||||
| inline void delay(size_t microseconds) | ||||
| { | ||||
|     // ~3 microsecs
 | ||||
|     for (auto i = 0; i < 32; i++) { | ||||
|     for (size_t i = 0; i < microseconds; ++i) | ||||
|         IO::in8(0x80); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling