170 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|     Copyright (C) 2012, Aaron Lindsay <aaron@aclindsay.com>
 | |
| 
 | |
|     This file is part of Aedrix.
 | |
| 
 | |
|     This program is free software; you can redistribute it and/or modify
 | |
|     it under the terms of the GNU General Public License as published by
 | |
|     the Free Software Foundation; either version 2 of the License, or
 | |
|     (at your option) any later version.
 | |
| 
 | |
|     This program is distributed in the hope that it will be useful,
 | |
|     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|     GNU General Public License for more details.
 | |
| 
 | |
|     You should have received a copy of the GNU General Public License along
 | |
|     with this program; if not, write to the Free Software Foundation, Inc.,
 | |
|     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 | |
|  */
 | |
| 
 | |
| #include <atags.h>
 | |
| #include <kmalloc.h>
 | |
| #include <mmu.h>
 | |
| #include <mm.h>
 | |
| #include <print.h>
 | |
| #include <framebuffer.h>
 | |
| #include <console.h>
 | |
| 
 | |
| #ifdef CONFIG_VEXPRESS_A9
 | |
| #include <devices/pl011.h>
 | |
| #include <devices/pl111.h>
 | |
| #endif
 | |
| 
 | |
| #ifdef CONFIG_RPI
 | |
| #include <devices/pi_mini_uart.h>
 | |
| #include <devices/bcm2835_videocore.h>
 | |
| #endif
 | |
| 
 | |
| struct fb myfb;
 | |
| 
 | |
| void print_console_logo() {
 | |
| 	print_func(&console_putc, "                            _            _      _\n");
 | |
| 	print_func(&console_putc, "                           / \\   ___  __| |_ __(_)_  __\n");
 | |
| 	print_func(&console_putc, "                          / _ \\ / _ \\/ _` | '__| \\ \\/ /\n");
 | |
| 	print_func(&console_putc, "                         / ___ \\  __/ (_| | |  | |>  <\n");
 | |
| 	print_func(&console_putc, "                        /_/   \\_\\___|\\__,_|_|  |_/_/\\_\\\n\n");
 | |
| 	print_func(&console_putc, "                        Copyright (C) 2012 - Aaron Lindsay\n");
 | |
| }
 | |
| 
 | |
| void video_init(void) {
 | |
| #ifdef CONFIG_VEXPRESS_A9
 | |
| 	pl111_init(&myfb, 16);
 | |
| #endif
 | |
| #ifdef CONFIG_RPI
 | |
| 	bcm2835_videocore_init(&myfb, 16);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| void test_mm() {
 | |
| 	struct page *p, *q;
 | |
| 
 | |
| 	print("\ntest_mm():\n");
 | |
| 
 | |
| 	p = mm_get_free_pages(0);
 | |
| 	if (p)
 | |
| 		print("%x, %x\n", p, p->address);
 | |
| 	else
 | |
| 		print("Error: failed to allocate memory for p\n");
 | |
| 
 | |
| 	q = mm_get_free_pages(4);
 | |
| 	if (q)
 | |
| 		print("%x, %x\n", q, q->address);
 | |
| 	else
 | |
| 		print("Error: failed to allocate memory for q\n");
 | |
| 
 | |
| 	mm_put_free_pages(p);
 | |
| 	mm_put_free_pages(q);
 | |
| 
 | |
| 	q = mm_get_free_pages(1);
 | |
| 	if (q)
 | |
| 		print("%x, %x\n", q, q->address);
 | |
| 	else
 | |
| 		print("Error: failed to allocate memory for q\n");
 | |
| 
 | |
| 	p = mm_get_free_pages(0);
 | |
| 	if (p)
 | |
| 		print("%x, %x\n", p, p->address);
 | |
| 	else
 | |
| 		print("Error: failed to allocate memory for p\n");
 | |
| 	mm_put_free_pages(p);
 | |
| 	mm_put_free_pages(q);
 | |
| 
 | |
| }
 | |
| 
 | |
| void test_kmalloc() {
 | |
| 	void *a, *b, *c, *d;
 | |
| 
 | |
| 	print("\ntest_kmalloc():\n");
 | |
| 
 | |
| 	a = kmalloc(4);
 | |
| 	print("a: %x\n", a);
 | |
| 	b = kmalloc(13);
 | |
| 	print("b: %x\n", b);
 | |
| 	c = kmalloc(4);
 | |
| 	print("c: %x\n", c);
 | |
| 	d = kmalloc(25);
 | |
| 	print("d: %x\n", d);
 | |
| 
 | |
| 	kfree(c);
 | |
| 	kfree(b);
 | |
| 	kfree(a);
 | |
| 	kfree(d);
 | |
| 
 | |
| 	a = kmalloc(13);
 | |
| 	print("a: %x\n", a);
 | |
| 	b = kmalloc(4);
 | |
| 	print("b: %x\n", b);
 | |
| 	c = kmalloc(25);
 | |
| 	print("c: %x\n", c);
 | |
| 	d = kmalloc(7);
 | |
| 	print("d: %x\n", d);
 | |
| }
 | |
| 
 | |
| void test_memory() {
 | |
| 	test_mm();
 | |
| 	test_kmalloc();
 | |
| }
 | |
| 
 | |
| void kmalloc_init();
 | |
|  
 | |
| int main(void) {
 | |
| 	char *lower, *upper;
 | |
| 	struct atag *atags;
 | |
| 
 | |
| 	//setup MMU
 | |
| 	mmu_reinit();
 | |
| 
 | |
| 	//initialize the serial console
 | |
| #ifdef CONFIG_VEXPRESS_A9
 | |
| 	print_init(&pl011_putc);
 | |
| #endif
 | |
| #ifdef CONFIG_RPI
 | |
| 	mini_uart_init();
 | |
| 	print_init(&mini_uart_putc);
 | |
| #endif
 | |
| 
 | |
| 	//setup memory
 | |
| 	mm_init();
 | |
| 	kmalloc_init();
 | |
| 
 | |
| 	if (atags_first_mem_region(&atags)) {
 | |
| 		print("Error: atags must contain at least one memory region\n");
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| 	do {
 | |
| 		lower = (char *)atags->data.mem.start;
 | |
| 		upper = lower + atags->data.mem.size - 1;
 | |
| 		declare_memory_region(lower, upper);
 | |
| 	} while (!atags_next_mem_region(&atags));
 | |
| 
 | |
| 	test_memory();
 | |
| 
 | |
| 	video_init();
 | |
| 	console_init(&myfb);
 | |
| 	print_console_logo();
 | |
| 
 | |
| 	return 0;
 | |
| }
 |