Changeset 73abf49 in mainline


Ignore:
Timestamp:
2021-06-22T19:36:32Z (3 years ago)
Author:
Maurizio Lombardi <mlombard@…>
Branches:
master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1b7b7af
Parents:
034ce6bb
git-author:
Maurizio Lombardi <mlombard@…> (2021-06-22 19:21:17)
git-committer:
Maurizio Lombardi <mlombard@…> (2021-06-22 19:36:32)
Message:

raspberrypi: mbox: read the framebuffer size from VideoCore

Get the real framebuffer size, do not assume
it's 640x480

Signed-off-by: Maurizio Lombardi <mlombard@…>

Location:
kernel
Files:
3 edited

Legend:

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

    r034ce6bb r73abf49  
    174174{
    175175#ifdef CONFIG_FB
     176        uint32_t width, height;
    176177        fb_properties_t prop;
    177         if (bcm2835_fb_init(&prop)) {
     178
     179        if (!bcm2835_mbox_get_fb_size(&width, &height)) {
     180                printf("mbox: could not get the framebuffer size\n");
     181                width = 640;
     182                height = 480;
     183        }
     184        if (bcm2835_fb_init(&prop, width, height)) {
    178185                outdev_t *fb_dev = fb_init(&prop);
    179186                if (fb_dev)
  • kernel/genarch/include/genarch/drivers/bcm2835/mbox.h

    r034ce6bb r73abf49  
    6868
    6969enum {
     70        MBOX_TAG_GET_PHYS_W_H   = 0x00040003,
     71        MBOX_TAG_SET_PHYS_W_H   = 0x00048003,
     72        MBOX_TAG_GET_VIRT_W_H   = 0x00040004,
     73        MBOX_TAG_SET_VIRT_W_G   = 0x00048004
     74};
     75
     76enum {
    7077        MBOX_PROP_CODE_REQ      = 0x00000000,
    7178        MBOX_PROP_CODE_RESP_OK  = 0x80000000,
     
    122129
    123130typedef struct {
     131        mbox_prop_buf_hdr_t     buf_hdr;
     132        mbox_tag_hdr_t          tag_hdr;
     133        struct {
     134                uint32_t        width;
     135                uint32_t        height;
     136        } body;
     137        uint32_t zero;
     138} mbox_getfbsize_buf_t;
     139
     140typedef struct {
    124141        ioport32_t width;
    125142        ioport32_t height;
     
    135152
    136153extern bool bcm2835_prop_get_memory(uint32_t *base, uint32_t *size);
    137 extern bool bcm2835_fb_init(fb_properties_t *prop);
     154extern bool bcm2835_fb_init(fb_properties_t *prop, uint32_t width, uint32_t heigth);
     155extern bool bcm2835_mbox_get_fb_size(uint32_t *h, uint32_t *w);
    138156
    139157#endif
  • kernel/genarch/src/drivers/bcm2835/mbox.c

    r034ce6bb r73abf49  
    8686}
    8787
    88 bool bcm2835_fb_init(fb_properties_t *prop)
     88bool bcm2835_fb_init(fb_properties_t *prop, uint32_t width, uint32_t height)
    8989{
    9090        bcm2835_mbox_t *fb_mbox;
     
    9595            KM_NATURAL_ALIGNMENT, PAGE_NOT_CACHEABLE);
    9696
    97         fb_desc->width = 640;
    98         fb_desc->height = 480;
     97        fb_desc->width = width;
     98        fb_desc->height = height;
    9999        fb_desc->virt_width = fb_desc->width;
    100100        fb_desc->virt_height = fb_desc->height;
     
    128128}
    129129
     130bool bcm2835_mbox_get_fb_size(uint32_t *w, uint32_t *h)
     131{
     132        bool r;
     133        MBOX_BUFF_ALLOC(msg, mbox_getfbsize_buf_t);
     134
     135        msg->buf_hdr.size = sizeof(mbox_getfbsize_buf_t);
     136        msg->buf_hdr.code = MBOX_PROP_CODE_REQ;
     137        msg->tag_hdr.tag_id = MBOX_TAG_GET_PHYS_W_H;
     138        msg->tag_hdr.buf_size = sizeof(msg->body);
     139        msg->tag_hdr.val_len  = 0;
     140        msg->zero = 0;
     141
     142        mbox_write((bcm2835_mbox_t *)BCM2835_MBOX0_ADDR,
     143            MBOX_CHAN_PROP_A2V, KA2VCA((uint32_t)msg));
     144        mbox_read((bcm2835_mbox_t *)BCM2835_MBOX0_ADDR,
     145            MBOX_CHAN_PROP_A2V);
     146
     147        r = msg->buf_hdr.code == MBOX_PROP_CODE_RESP_OK;
     148        if (r) {
     149                *h = msg->body.height;
     150                *w = msg->body.width;
     151        }
     152
     153        return r;
     154}
     155
    130156/**
    131157 * @}
Note: See TracChangeset for help on using the changeset viewer.