Add devices directory, and PL011 and PL110 basic (very!) device drivers
This commit is contained in:
		
							
								
								
									
										1
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
									
									
									
									
								
							| @@ -21,6 +21,7 @@ KOBJS = | ||||
|  | ||||
| include boot/Makefile.inc | ||||
| include kernel/Makefile.inc | ||||
| include devices/Makefile.inc | ||||
|  | ||||
| all: aedrix-kernel | ||||
| #all:  | ||||
|   | ||||
							
								
								
									
										4
									
								
								devices/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								devices/Makefile.inc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| DEVICES_PREFIX = devices | ||||
|  | ||||
| KOBJS += $(DEVICES_PREFIX)/pl110.o | ||||
| KOBJS += $(DEVICES_PREFIX)/pl011.o | ||||
							
								
								
									
										13
									
								
								devices/pl011.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								devices/pl011.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| #define PL011_SERIAL_BASE 0x16000000 | ||||
| #define PL011_SERIAL_FLAG_REGISTER 0x18 | ||||
| #define PL011_SERIAL_BUFFER_FULL (1 << 5) | ||||
|  | ||||
| void pl011_putc(char c) | ||||
| { | ||||
|     /* Wait until the serial buffer is empty */ | ||||
|     while (*(volatile unsigned long*)(PL011_SERIAL_BASE + PL011_SERIAL_FLAG_REGISTER) | ||||
| 		    & (PL011_SERIAL_BUFFER_FULL)); | ||||
|  | ||||
|     /* When it's empty, put our character at the base */ | ||||
|     *(volatile unsigned long*)PL011_SERIAL_BASE = c; | ||||
| } | ||||
							
								
								
									
										55
									
								
								devices/pl110.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								devices/pl110.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| #include <framebuffer.h> | ||||
|  | ||||
| typedef unsigned int		uint32; | ||||
|  | ||||
| #define PL110_CR_EN		0x001 | ||||
| #define PL110_CR_PWR		0x800 | ||||
| #define PL110_IOBASE		0xc0000000 | ||||
| #define PL110_PALBASE		(PL110_IOBASE + 0x200) | ||||
| #define PL110_FB_BASE		0x200000; | ||||
|  | ||||
| struct pl110_control { | ||||
| 	uint32	volatile timing0;	//0 | ||||
| 	uint32	volatile timing1;	//4 | ||||
| 	uint32	volatile timing2;	//8 | ||||
| 	uint32	volatile timing3;	//c | ||||
| 	uint32	volatile upbase;	//10 | ||||
| 	uint32	volatile lpbase;	//14 | ||||
| 	uint32	volatile intrenable;	//18 | ||||
| 	uint32	volatile control;	//1c | ||||
| }; | ||||
|  | ||||
| struct fbdev pl110_fb_device; | ||||
|  | ||||
| int pl110_init(struct fb *f, unsigned int color_depth) { | ||||
| 	struct pl110_control *plio = (struct pl110_control*)PL110_IOBASE; | ||||
|  | ||||
| 	/* 640x480 pixels */ | ||||
| 	plio->timing0 = 0x3f1f3f9c; | ||||
| 	plio->timing1 = 0x080b61df; | ||||
| 	plio->upbase = PL110_FB_BASE; | ||||
|  | ||||
| 	if (color_depth == FB_COLOR_DEPTH_8) { | ||||
| 		plio->control = 0x1827; | ||||
| 	} else if (color_depth == FB_COLOR_DEPTH_16) { | ||||
| 		plio->control = 0x1829; | ||||
| 	} else if (color_depth == FB_COLOR_DEPTH_24) { | ||||
| 		plio->control = 0x182B; | ||||
| 	} else { | ||||
| 		//assume 16 if nothing else fit | ||||
| 		color_depth = 16; | ||||
| 		plio->control = 0x1829; | ||||
| 	} | ||||
|  | ||||
| 	f->device = &pl110_fb_device; | ||||
| 	f->device->fbaddr = (void*)PL110_FB_BASE; | ||||
| 	f->width = 640; | ||||
| 	f->device->pixelwidth = 640; | ||||
| 	f->height = 480; | ||||
| 	f->device->pixelheight = 480; | ||||
|  | ||||
| 	f->color_depth = color_depth; | ||||
| 	f->device->color_depth = color_depth; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
							
								
								
									
										6
									
								
								include/devices/pl011.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								include/devices/pl011.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| #ifndef PL011_H | ||||
| #define PL011_H | ||||
|  | ||||
| void pl011_putc(char c); | ||||
|  | ||||
| #endif /* PL011_H */ | ||||
							
								
								
									
										3
									
								
								include/devices/pl110.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								include/devices/pl110.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| #include <framebuffer.h> | ||||
|  | ||||
| int pl110_init(struct fb *f, unsigned int color_depth); | ||||
		Reference in New Issue
	
	Block a user