/* * TODO If fb is a default kerror output device then a fb should be registered * before kerror is initialized but there is no obvious way to do that, since * we definitely want to keep fb constructors in driver files to support * dynamic loading, in the future, just for example. */ int fb_register(struct fb_conf * fb) { const int minor = atomic_inc(&fb_minor); dev_t devid_tty; dev_t devid_mm; int err; devid_tty = DEV_MMTODEV(VDEV_MJNR_FB, minor); devid_mm = DEV_MMTODEV(VDEV_MJNR_FBMM, minor); fb_console_init(fb); err = fb_console_maketty(fb, devid_tty); if (err) { KERROR(KERROR_ERR, "FB: maketty failed\n"); return err; } err = fb_makemmdev(fb, devid_mm); if (err) { KERROR(KERROR_ERR, "FB: makemmdev failed\n"); return err; } draw_splash(fb); fb_console_write(fb, "FB ready\r\n"); return 0; }
void kmain() { irq_disable(); /* * A primeira coisa a se fazer é iniciar todo o gerenciador * de memória. */ mm_init(); arch_early_init(); ioremap_init(); irq_init(); sched_init(); timer_init(); /* * Neste momento temos o gerenciador de memória e escalonador prontos, * já podemos habilitar as interrupções, que podem ser utilizadas * pelos drivers. */ irq_enable(); /* Inicia os drivers da plataforma */ arch_setup(); /* Requisita um modo se existir um framebuffer*/ fb_set_mode(); /* Inicia o console sobre o framebuffer */ fb_console_init(); kernel_info(); #if 1 irq_disable(); semaphore_init(&sem, 1); create_task("a", 4); create_task("b", 5); create_task("c", 6); create_task("d", 7); create_task("b", 8); create_task("b", 9); irq_enable(); /* Fica de boas esperando as trocas de contexto */ #endif /* Como queremos imprimir para depuração do driver, inicializamos ele agora */ //bcm2835_emmc_init(); for (;;) { led_blink(); //printk("-"); } }