| 
									
										
										
										
											2025-04-17 19:03:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "riscv.h"
 | 
					
						
							|  |  |  | #include "stdio.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define PRINT_BASE_ADDR 0x40000000
 | 
					
						
							|  |  |  | #define PRINT_SIZE 0x4
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define dev_wr(addr) g_map[(addr-PRINT_BASE_ADDR) >> 2]
 | 
					
						
							|  |  |  | #define dev_wrb(addr) ((uint8_t *)g_map)[(addr-PRINT_BASE_ADDR)]
 | 
					
						
							|  |  |  | #define dev_wrh(addr) ((uint16_t *)g_map)[(addr-PRINT_BASE_ADDR) >> 1]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static uint32_t g_map[1]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static uint32_t read(uint32_t addr) { | 
					
						
							|  |  |  |   if (!(addr & 0x3)) { | 
					
						
							|  |  |  |     return dev_wr(addr); | 
					
						
							|  |  |  |   } else if (!(addr & 0x1)) { | 
					
						
							|  |  |  |     return dev_wrh(addr); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     return dev_wrb(addr); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define BUFF_LEN 1024
 | 
					
						
							|  |  |  | static char g_buff[BUFF_LEN]; | 
					
						
							|  |  |  | static int g_index; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void write(uint32_t addr, uint32_t data) { | 
					
						
							|  |  |  |   // printf("print: write data=%x\n", data);
 | 
					
						
							|  |  |  |   if (!(addr & 0x3)) { | 
					
						
							|  |  |  |     dev_wr(addr) = data; | 
					
						
							|  |  |  |   } else if (!(addr & 0x1)) { | 
					
						
							|  |  |  |     dev_wrh(addr) = data; | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     dev_wrb(addr) = data; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (g_index < BUFF_LEN) { | 
					
						
							|  |  |  |     g_buff[g_index++] = data; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   if (data == '\n') { | 
					
						
							|  |  |  |     g_buff[g_index] = 0; | 
					
						
							| 
									
										
										
										
											2025-04-18 19:18:49 +08:00
										 |  |  |     printf("\033[33m%s\033[0m", g_buff); | 
					
						
							| 
									
										
										
										
											2025-04-17 19:03:28 +08:00
										 |  |  |     g_index = 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const static device_t g_print = { | 
					
						
							|  |  |  |     .addr = PRINT_BASE_ADDR, | 
					
						
							|  |  |  |     .size = PRINT_SIZE, | 
					
						
							|  |  |  |     .read = read, | 
					
						
							|  |  |  |     .write = write, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const device_t* print_dev() { | 
					
						
							|  |  |  |   return &g_print; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |