Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c

    ra14f346 r1466a8f  
    3838#include <genarch/drivers/amdm37x_uart/amdm37x_uart.h>
    3939#include <genarch/drivers/amdm37x_gpt/amdm37x_gpt.h>
     40#include <genarch/drivers/amdm37x_dispc/amdm37x_dispc.h>
    4041#include <genarch/fb/fb.h>
    4142#include <genarch/srln/srln.h>
     
    6061
    6162static struct beagleboard {
     63        amdm37x_dispc_regs_t *dispc;
    6264        amdm37x_irc_regs_t *irc_addr;
    6365        amdm37x_uart_t uart;
     
    8385}
    8486
     87static void bbxm_setup_fb(unsigned width, unsigned height, unsigned bpp)
     88{
     89        const unsigned pixel_bytes = (bpp / 8);
     90        const size_t size = ALIGN_UP(width * height * pixel_bytes, FRAME_SIZE);
     91        const unsigned frames = size / FRAME_SIZE;
     92        unsigned order = 0;
     93        unsigned frame = 1;
     94        while (frame < frames) {
     95                frame *= 2;
     96                ++order;
     97        }
     98        /* prefer highmem as we don't care about virtual mapping. */
     99        void *buffer = frame_alloc(order, FRAME_LOWMEM);
     100        if (!buffer) {
     101                printf("Failed to allocate framebuffer.\n");
     102                return;
     103        }
     104
     105        amdm37x_dispc_setup_fb(beagleboard.dispc, width, height, bpp,
     106            (uintptr_t) buffer);
     107
     108        fb_properties_t prop = {
     109                .addr = (uintptr_t)buffer,
     110                .offset = 0,
     111                .x = width,
     112                .y = height,
     113                .scan = width * pixel_bytes,
     114                .visual = VISUAL_RGB_5_6_5_LE
     115        };
     116        switch (bpp)
     117        {
     118        case 8:
     119                prop.visual = VISUAL_INDIRECT_8; break;
     120        case 16:
     121                prop.visual = VISUAL_RGB_5_6_5_LE; break;
     122        case 24:
     123                prop.visual = VISUAL_BGR_8_8_8; break;
     124        case 32:
     125                prop.visual = VISUAL_RGB_8_8_8_0; break;
     126        default:
     127                printf("Invalid framebuffer bit depth: bailing out.\n");
     128                return;
     129        }
     130        outdev_t *fb_dev = fb_init(&prop);
     131        if (fb_dev)
     132                stdout_wire(fb_dev);
     133
     134}
     135
    85136static void bb_timer_irq_handler(irq_t *irq)
    86137{
     
    103154        ASSERT(beagleboard.irc_addr);
    104155        amdm37x_irc_init(beagleboard.irc_addr);
     156
     157        /* Map display controller */
     158        beagleboard.dispc = (void*) km_map(AMDM37x_DISPC_BASE_ADDRESS,
     159            AMDM37x_DISPC_SIZE, PAGE_NOT_CACHEABLE);
     160        ASSERT(beagleboard.dispc);
    105161
    106162        /* Initialize timer. Use timer1, because it is in WKUP power domain
     
    167223static void bbxm_output_init(void)
    168224{
     225#ifdef CONFIG_FB
     226        bbxm_setup_fb(CONFIG_BFB_WIDTH, CONFIG_BFB_HEIGHT, CONFIG_BFB_BPP);
     227#else
     228        (void)bbxm_setup_fb;
     229#endif
    169230        /* UART3 is wired to external RS232 connector */
    170231        const bool ok = amdm37x_uart_init(&beagleboard.uart,
Note: See TracChangeset for help on using the changeset viewer.