/* Copyright (C) 2012, Aaron Lindsay 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 #include #include #include #include #include #include #ifdef CONFIG_VEXPRESS_A9 #include #include #endif #ifdef CONFIG_RPI #include #include #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; }