[rpi bsp] add cmdline options

Pavel Pisa pisa at cmp.felk.cvut.cz
Wed Jul 29 18:53:36 UTC 2015


Hello Qiao Yang,

On Tuesday 28 of July 2015 01:35:45 Pavel Pisa wrote:
> Hello Qiao Yang,
>
> On Friday 24 of July 2015 18:04:47 QIAO YANG wrote:
> > Some updates for you. I've found out that my previous problem with
> > cmdline due to my minicom didn't wrap up the lines.... I've chosen the
> > interface of vc to retrieve cmdline so that we don't need to parse the
> > atag nor devicetree. Now we can use --video=...  to choose resolution and
> > --console=... to choose console.

I have got to little more testing. Ticker runs correctly
with console on serial port and even with graphics console.
But option --console=fbcons works only if it is the last option
on the line in cmdline.txt. Problem is in the comparison because
if there are more options then string provided by rpi_cmdline_arg()
continues after "fbcons" by blank character. I think that
copy of the string to the user provided buffer is not necessary
in rpi_cmdline_arg(). It would bring up issues with space enough
to fit data etc. I have use simple strncmp to resolve issue.
But something more elegant can be provided.

diff --git a/c/src/lib/libbsp/arm/raspberrypi/console/console_select.c b/c/src/lib/libbsp/arm/raspberrypi
index 74cf78e..ad24d33 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/console/console_select.c
+++ b/c/src/lib/libbsp/arm/raspberrypi/console/console_select.c
@@ -91,7 +91,7 @@ void bsp_console_select(void)
    if (opt)
   {
       opt += sizeof("--console=")-1;
-      if (strcmp(opt,"fbcons") == 0)
+      if (strncmp(opt,"fbcons", sizeof("fbcons"-1)) == 0)
       {
         Console_Port_Minor = BSP_CONSOLE_FB;
         BSPPrintkPort      = BSP_CONSOLE_FB;
@@ -99,8 +99,8 @@ void bsp_console_select(void)
   }
   else
   {
-    Console_Port_Minor = BSP_CONSOLE_FB;
-    BSPPrintkPort      = BSP_CONSOLE_FB;
+    Console_Port_Minor = BSP_CONSOLE_UART0;
+    BSPPrintkPort      = BSP_CONSOLE_UART0;
   }

   /*

> As for the interface to command line through VC, I expect that
> this interface allows access only to value set in config.txt
> but it is not changed by U-boot if used. If that is true
> then use of ATAG or device tree would be better for flexibility.
> It would be reusable on other ARM targets as well.
> But that this can be tried in some follow up project.

It seems to me that behavior is as expected, VideoCore
returns what it parsed from cmdline.txt but arguments
set by U-boot are different. So long term term solution
is to implement shared ARM BSP atags and devicetree parser.
It can be minimal for start only to locate kernel command
line. It would help to other ARM BSPs in general.

MMU setup seems to be OK for me, but what I really
dislike is duplicate of arm-cp15-start.h to RPi.
Shared one should be used.

Les problem is to use different name for
arm_cp15_start_mmu_config_table to not clash
with the definition in header.

I think that the name arm_cp15_start_mmu_config_table
is not part of RTEMS API so it can be changed freely
and if original arm_cp15_start_mmu_config_table
is not defined then incorrect use is catch
easily.

Please, try to resolve this first. Then the suggested
change for strncmp and do more testing.

I suggest to adapt rpi_init_cmdline() a little.

void rpi_init_cmdline(void)
{
  bcm2835_get_cmdline_entries get_cmdline_entries;
  bcm2835_mailbox_get_cmdline(&get_cmdline_entries);
  int i; /*I suggest to be C89 compatible, do not
           mix declaration with code in single block */
  for (i = 0; i < MAX_CMDLINE_LENGTH; ++i)
  {
    _rpi_cmdline[i] = get_cmdline_entries.cmdline[i];
  }
}

It is not necessary to place 512 bytes onto stack.
If you declare get_cmdline_entries static global

static bcm2835_get_cmdline_entries get_cmdline_entries;

Then you can read the line to this global.

If you declare then _rpi_cmdline as

char *_rpi_cmdline;

you only point it into right place and do not need
copy. You should add code, which ensures that command
line is zero terminated if you use strstr() later.

You can use something like


  bcm2835_mailbox_get_cmdline(&get_cmdline_entries);
  get_cmdline_entries.cmdline[sizeof(get_cmdline_entries.cmdline) - 1] = 0;

Generally code division to the functions
and files looks good.

Best wishes, 

            Pavel



More information about the devel mailing list