[PATCH 1/2] i386/pc386/VESA framebuffer driver: modified and extended initialization options

Gedare Bloom gedare at rtems.org
Tue May 19 15:38:30 UTC 2015


On Tue, May 19, 2015 at 10:34 AM, Jan Dolezal <dolezj21 at fel.cvut.cz> wrote:
> driver is not initialized by default
> initialization is possible through multiboot command line option or
> through string variable set in user's module allowing the driver
> to evaluate this variable after the two modules are linked together
> ---
>  c/src/lib/libbsp/i386/pc386/console/fb_vesa_rm.c | 152 +++++++++++++++++++----
>  1 file changed, 127 insertions(+), 25 deletions(-)
>
> diff --git a/c/src/lib/libbsp/i386/pc386/console/fb_vesa_rm.c b/c/src/lib/libbsp/i386/pc386/console/fb_vesa_rm.c
> index d6fd174..5c4d8bf 100644
> --- a/c/src/lib/libbsp/i386/pc386/console/fb_vesa_rm.c
> +++ b/c/src/lib/libbsp/i386/pc386/console/fb_vesa_rm.c
> @@ -19,8 +19,14 @@
>   *
>   * Driver reads parameter from multiboot command line to setup video:
>   * "--video=<resX>x<resY>[-<bpp>]"
> - * If cmdline parameter is not specified an attempt for obtaining
> - * resolution from display attached is made.
> + * "--video=auto" - try EDID to find mode that fits the display attached best
> + * "--video=none" / "--video=off" - do not initialize the driver
> + * If cmdline parameter is not specified the rtems_console_vbe_default
> + * variable content is tested (see doc below).
> + * Command line option has higher priority. rtems_console_vbe_default is probed
> + * only if cmdline "--video=" is not specified at all.
> + *
> + * If neither of the above options is specified the driver is not initialized.
>   */
>
>  /*
> @@ -31,7 +37,7 @@
>   * found in the file LICENSE in this distribution or at
>   * http://www.rtems.org/license/LICENSE.
>   *
> - * The code for rtems_buffer_* functions were greatly
> + * The code for rtems_buffer_* functions was greatly
>   * inspired or coppied from:
>   *   - RTEMS fb_cirrus.c - Alexandru-Sever Horin (alex.sever.h at gmail.com)
>   */
> @@ -53,6 +59,22 @@
>  #define FB_VESA_NAME    "FB_VESA_RM"
>
>  /**
> + * @brief Allows to enable initialization of this driver from an application
> + * by setting the value of this variable to non null value in
> + * user's module. The value of this variable will be then updated
> + * when linked with application's object.
> + *
> + * Further if the value points to string in format:
> + * "<resX>x<resY>[-<bpp>]"
> + * "auto" - try EDID to find mode that fits the display attached best
> + * "none" / "off" - do not initialize the driver
> + * the given parameters are used if applicable.
> + *
> + * Command line option string has priority over this string.
> + */
> +const char * const rtems_console_vbe_default;
> +
If this variable is not exported elsewhere, it should be made 'static'.

> +/**
>   * @brief Initializes VBE framebuffer during bootup.
>   *
>   * utilizes switches to real mode interrupts and therefore must be
> @@ -212,6 +234,14 @@ typedef struct {
>      uint8_t bpp;
>  } Mode_params;
>
> +typedef enum {
> +    NO_SUITABLE_MODE    = -1,
> +    BAD_FORMAT          = -2,
> +    AUTO_SELECT         = -3,
> +    DONT_INIT           = -4,
> +    NO_MODE_REQ         = -5,
> +} mode_err_ret_val;
> +

Can the valid and invalid modes be in the same enum, and that can be
used as the type too?

>  /**
>   * @brief Find mode by resolution in the given list of modes
>   *
> @@ -249,37 +279,48 @@ static uint16_t find_mode_by_resolution(Mode_params *mode_list,
>          }
>          i++;
>      }
> -    return -1;
> +    return NO_SUITABLE_MODE;
>  }
>
>  /**
> - * @brief Find mode given within command line.
> + * @brief Find mode given in string format.
>   *
> - * Parse command line option "--video=" if available.
>   *  expected format
> - *  --video=<resX>x<resY>[-<bpp>]
> + *  <resX>x<resY>[-<bpp>]
>   *  numbers <resX>, <resY> and <bpp> are decadic
>   *
>   * @param[in] mode_list list of modes to be searched
>   * @param[in] list_length number of modes in the list
> + * @param[in] video_string string to be parsed
>   * @retval video mode number to be set
> - * @retval -1 on parsing error or when no suitable mode found
> + * @retval -1 no suitable mode found
> + * @retval -2 bad format of the video_string
> + * @retval -3 automatic mode selection requested
> + * @retval -4 request to not initialize graphics
> + * @retval -5 no mode requested/empty video string
>   */
> -static uint16_t find_mode_using_cmdline(Mode_params *mode_list,
> -                                        uint8_t list_length)
> +static uint16_t find_mode_from_string(Mode_params *mode_list,
> +                                      uint8_t list_length,
> +                                      const char *video_string)
Is it ok to cast a negative enum value into a uint16_t?

>  {
>      const char* opt;
>      Mode_params cmdline_mode;
>      char* endptr;
> -    cmdline_mode.bpp = 0;
> -    opt = bsp_cmdline_arg("--video=");
> +    cmdline_mode.bpp = 16; /* default bpp */
> +    opt = video_string;
>      if (opt)
>      {
> -        opt += sizeof("--video=")-1;
> +        if (strncmp(opt, "auto", 4) == 0)
> +            return AUTO_SELECT;
> +        if (strncmp(opt, "none", 4) == 0 ||
> +            strncmp(opt, "off", 3) == 0)
> +        {
> +            return DONT_INIT;
> +        }
>          cmdline_mode.resX = strtol(opt, &endptr, 10);
>          if (*endptr != 'x')
>          {
> -            return -1;
> +            return BAD_FORMAT;
>          }
>          opt = endptr+1;
>          cmdline_mode.resY = strtol(opt, &endptr, 10);
> @@ -294,21 +335,50 @@ static uint16_t find_mode_using_cmdline(Mode_params *mode_list,
>                      cmdline_mode.bpp = strtol(opt, &endptr, 10);
>                      if (*endptr != ' ')
>                      {
> -                        return -1;
> +                        return BAD_FORMAT;
>                      }
>                  }
>              case ' ':
>              case 0:
>                  break;
>              default:
> -                return -1;
> +                return BAD_FORMAT;
>          }
>
> -        if (find_mode_by_resolution(mode_list, list_length, &cmdline_mode) !=
> -            (uint16_t)-1)
> -            return cmdline_mode.mode_number;
> +        return find_mode_by_resolution(mode_list, list_length, &cmdline_mode);
>      }
> -    return -1;
> +    return NO_MODE_REQ;
> +}
> +
> +
> +/**
> + * @brief Find mode given within command line.
> + *
> + * Parse command line option "--video=" if available.
> + *  expected format
> + *  --video=<resX>x<resY>[-<bpp>]
> + *  numbers <resX>, <resY> and <bpp> are decadic
> + *
> + * @param[in] mode_list list of modes to be searched
> + * @param[in] list_length number of modes in the list
> + * @retval video mode number to be set
> + * @retval -1 no suitable mode found
> + * @retval -2 bad format of the video_string
> + * @retval -3 automatic mode selection requested
> + * @retval -4 request to not initialize graphics
> + * @retval -5 no mode requested/empty video string
> + */
> +static uint16_t find_mode_using_cmdline(Mode_params *mode_list,
> +                                        uint8_t list_length)
> +{
> +    const char* opt;
> +    opt = bsp_cmdline_arg("--video=");
> +    if (opt)
> +    {
> +        opt += sizeof("--video=")-1;
> +        return find_mode_from_string(mode_list, list_length, opt);
> +    }
> +    return NO_MODE_REQ;
>  }
>
>  /**
> @@ -569,6 +639,7 @@ void vesa_realmode_bootup_init(void)
>      uint16_t *modeNOPtr = (uint16_t*)
>          i386_Real_to_physical(*(vmpSegOff+1), *vmpSegOff);
>      uint16_t iterator = 0;
> +
>      if (*(uint16_t*)vib->VideoModePtr == VBE_STUB_VideoModeList)
>      {
>          printk(FB_VESA_NAME " VBE Core not implemented!\n");
> @@ -618,6 +689,40 @@ void vesa_realmode_bootup_init(void)
>      sorted_mode_params[nextFilteredMode].mode_number = 0;
>
>      uint8_t number_of_modes = nextFilteredMode;
> +
> +    /* first search for video argument in multiboot options */
> +    vbe_used_mode = find_mode_using_cmdline(sorted_mode_params,
> +                                            number_of_modes);
> +
> +    if (vbe_used_mode == (uint16_t) NO_MODE_REQ) {
> +        vbe_used_mode = find_mode_from_string(sorted_mode_params,
> +                            number_of_modes, rtems_console_vbe_default);
> +        if (vbe_used_mode != (uint16_t) NO_MODE_REQ) {
> +            printk(FB_VESA_NAME " using application option to select"
> +                " video mode\n");
> +        }
> +    }
> +    else
> +    {
> +        printk(FB_VESA_NAME " using command line option '--video='"
> +            "to select video mode\n");
> +    }
> +
> +    switch (vbe_used_mode) {
> +        case (uint16_t) NO_SUITABLE_MODE:
> +            printk(FB_VESA_NAME " requested mode not found\n");
> +            return;
> +        case (uint16_t) BAD_FORMAT:
> +            printk(FB_VESA_NAME " bad format of video requested\n");
> +            return;
> +        case (uint16_t) DONT_INIT:
> +            printk(FB_VESA_NAME " selected not to initialize graphics\n");
> +            return;
> +        case (uint16_t) NO_MODE_REQ:
> +            printk(FB_VESA_NAME " not initialized, no video selected\n");
> +            return;
> +    }
> +
>      /* sort filtered modes */
>      Mode_params modeXchgPlace;
>      iterator = 0;
> @@ -657,12 +762,9 @@ void vesa_realmode_bootup_init(void)
>          iterator++;
>      }
>
> -    /* first search for video argument in multiboot options */
> -    vbe_used_mode = find_mode_using_cmdline(sorted_mode_params,
> -                                            number_of_modes);
> -    if (vbe_used_mode == (uint16_t)-1)
> +    if (vbe_used_mode == (uint16_t)AUTO_SELECT)
>      {
> -        printk(FB_VESA_NAME " video on command line not provided"
> +        printk(FB_VESA_NAME " auto video mode selected"
>              "\n\ttrying EDID ...\n");
>          /* second search monitor for good resolution */
>          vbe_used_mode = find_mode_using_EDID(sorted_mode_params,
> --
> 1.9.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list