diff mbox

raspberrypi, raspberrypi2: add a serial console

Message ID 1459202897-21440-1-git-send-email-luca@lucaceresoli.net
State Changes Requested
Headers show

Commit Message

Luca Ceresoli March 28, 2016, 10:08 p.m. UTC
The current Buildroot defconfigs for Raspberry Pi and Raspberry Pi 2
instantiate a console on tty1, which appears on HDMI. Add a console on
the serial port (ttyAMA0) to be more consistent with other defconfigs
and provide a better out-of-the-box experience to users used to have a
serial console from Buildroot defconfigs.

This requires two changes:
 1. have two 'console=' entries in the kernel command line;
 2. add a new getty process to the generated inittab.

Step 2 requires a post-build script since the Buildroot makefiles can
configure only one console. But instead of simply adding a new getty
on ttyAMA0 (which would work) this patch actually changes
BR2_TARGET_GENERIC_GETTY_PORT from tty1 to ttyAMA0, then adds back
tty1 via post-build.sh. This is done only to avoid the
"GENERIC_SERIAL" comment where we instantiate an HDMI console, then
instantiate a really-serial console on another line.

The result is these two inittab lines:

  ttyAMA0::respawn:/sbin/getty -L  ttyAMA0 0 vt100 # GENERIC_SERIAL
  tty1::respawn:/sbin/getty -L  tty1 0 vt100 # HDMI console

Cc: Yann E. MORIN <yann.morin.1998@free.fr>
Signed-off-by: Luca Ceresoli <luca@lucaceresoli.net>

---

Tested on both Raspberry Pi B and Raspberry Pi 2, each on serial and
HDMI console.
---
 board/raspberrypi/post-build.sh  | 9 +++++++++
 configs/raspberrypi2_defconfig   | 3 ++-
 configs/raspberrypi_defconfig    | 3 ++-
 package/rpi-firmware/cmdline.txt | 2 +-
 4 files changed, 14 insertions(+), 3 deletions(-)
 create mode 100755 board/raspberrypi/post-build.sh

Comments

Alexander Dahl March 29, 2016, 11:30 a.m. UTC | #1
Hei hei,

Am 2016-03-29 00:08, schrieb Luca Ceresoli:
> The current Buildroot defconfigs for Raspberry Pi and Raspberry Pi 2
> instantiate a console on tty1, which appears on HDMI. Add a console on
> the serial port (ttyAMA0) to be more consistent with other defconfigs
> and provide a better out-of-the-box experience to users used to have a
> serial console from Buildroot defconfigs.

I ran in the very problem last week. So +1 for the idea.

> This requires two changes:
>  1. have two 'console=' entries in the kernel command line;
>  2. add a new getty process to the generated inittab.

Then why not split up those two changes in two patches? ;-)

> -BR2_TARGET_GENERIC_GETTY_PORT="tty1"
> +BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"

+1

> diff --git a/package/rpi-firmware/cmdline.txt b/package/rpi-firmware/cmdline.txt
> index 38aa3782621b..155a54693bff 100644
> --- a/package/rpi-firmware/cmdline.txt
> +++ b/package/rpi-firmware/cmdline.txt
> @@ -1 +1 @@
> -root=/dev/mmcblk0p2 rootwait
> +root=/dev/mmcblk0p2 rootwait console=tty1 console=ttyAMA0,115200

+1

Not sure about the post build script though, maybe someone with more
experience in buildroot could comment on that.

Greets
Alex
Luca Ceresoli March 29, 2016, 2:12 p.m. UTC | #2
Hei hei Alexander,

thanks for your review! See below by replies.

However, when replying to a mail on the mailing list, please reply to
all. This helps involved people to follow the discussion. Typically an
e-mail sent directly is seen sooner that one on a mailing list only.

On 29/03/2016 13:30, Alexander Dahl wrote:
> Hei hei,
> 
> Am 2016-03-29 00:08, schrieb Luca Ceresoli:
>> The current Buildroot defconfigs for Raspberry Pi and Raspberry Pi 2
>> instantiate a console on tty1, which appears on HDMI. Add a console on
>> the serial port (ttyAMA0) to be more consistent with other defconfigs
>> and provide a better out-of-the-box experience to users used to have a
>> serial console from Buildroot defconfigs.
> 
> I ran in the very problem last week. So +1 for the idea.
> 
>> This requires two changes:
>>  1. have two 'console=' entries in the kernel command line;
>>  2. add a new getty process to the generated inittab.
> 
> Then why not split up those two changes in two patches? ;-)

Because change 1 alone is almost useless. It just outputs kernel booting
and early init messages on UART, but no console. I see adding a UART
console as a self-contained change, but of course that's only my opinion.

> 
>> -BR2_TARGET_GENERIC_GETTY_PORT="tty1"
>> +BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"
> 
> +1
> 
>> diff --git a/package/rpi-firmware/cmdline.txt b/package/rpi-firmware/cmdline.txt
>> index 38aa3782621b..155a54693bff 100644
>> --- a/package/rpi-firmware/cmdline.txt
>> +++ b/package/rpi-firmware/cmdline.txt
>> @@ -1 +1 @@
>> -root=/dev/mmcblk0p2 rootwait
>> +root=/dev/mmcblk0p2 rootwait console=tty1 console=ttyAMA0,115200
> 
> +1
> 
> Not sure about the post build script though, maybe someone with more
> experience in buildroot could comment on that.

That's OK if you don't feel confident enough to give your official
Acked-by or Reviewed-by tag. Still, you can test the patch on a real
board and report back the outcome. If it works, you can add your
Tested-by tag. Otherwise, please report what went wrong. More details on:

http://nightly.buildroot.org/manual.html#_reviewing_and_testing_patches

Cheers,
Arnout Vandecappelle March 29, 2016, 8:32 p.m. UTC | #3
On 03/29/16 00:08, Luca Ceresoli wrote:
> The current Buildroot defconfigs for Raspberry Pi and Raspberry Pi 2
> instantiate a console on tty1, which appears on HDMI. Add a console on
> the serial port (ttyAMA0) to be more consistent with other defconfigs
> and provide a better out-of-the-box experience to users used to have a
> serial console from Buildroot defconfigs.
>
> This requires two changes:
>   1. have two 'console=' entries in the kernel command line;
>   2. add a new getty process to the generated inittab.
>
> Step 2 requires a post-build script since the Buildroot makefiles can
> configure only one console. But instead of simply adding a new getty
> on ttyAMA0 (which would work) this patch actually changes
> BR2_TARGET_GENERIC_GETTY_PORT from tty1 to ttyAMA0, then adds back
> tty1 via post-build.sh. This is done only to avoid the
> "GENERIC_SERIAL" comment where we instantiate an HDMI console, then
> instantiate a really-serial console on another line.
>
> The result is these two inittab lines:
>
>    ttyAMA0::respawn:/sbin/getty -L  ttyAMA0 0 vt100 # GENERIC_SERIAL
>    tty1::respawn:/sbin/getty -L  tty1 0 vt100 # HDMI console
>
> Cc: Yann E. MORIN <yann.morin.1998@free.fr>
> Signed-off-by: Luca Ceresoli <luca@lucaceresoli.net>
>
> ---
>
> Tested on both Raspberry Pi B and Raspberry Pi 2, each on serial and
> HDMI console.
> ---
>   board/raspberrypi/post-build.sh  | 9 +++++++++
>   configs/raspberrypi2_defconfig   | 3 ++-
>   configs/raspberrypi_defconfig    | 3 ++-
>   package/rpi-firmware/cmdline.txt | 2 +-
>   4 files changed, 14 insertions(+), 3 deletions(-)
>   create mode 100755 board/raspberrypi/post-build.sh
>
> diff --git a/board/raspberrypi/post-build.sh b/board/raspberrypi/post-build.sh
> new file mode 100755
> index 000000000000..7eae14a88569
> --- /dev/null
> +++ b/board/raspberrypi/post-build.sh
> @@ -0,0 +1,9 @@
> +#!/bin/sh
> +
> +set -u
> +set -e
> +
> +# Add a console on tty1
> +grep -qE '^tty1::' ${TARGET_DIR}/etc/inittab || \
> +sed -i '/GENERIC_SERIAL/a\
> +tty1::respawn:/sbin/getty -L  tty1 0 vt100 # HDMI console' ${TARGET_DIR}/etc/inittab
> diff --git a/configs/raspberrypi2_defconfig b/configs/raspberrypi2_defconfig
> index ce41ee31adba..0ffc6cdaf158 100644
> --- a/configs/raspberrypi2_defconfig
> +++ b/configs/raspberrypi2_defconfig
> @@ -5,7 +5,7 @@ BR2_ARM_FPU_NEON_VFPV4=y
>
>   BR2_TOOLCHAIN_BUILDROOT_CXX=y
>
> -BR2_TARGET_GENERIC_GETTY_PORT="tty1"
> +BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"

  Why not keep the default "console"? That should work, no? Or doesn't that work 
if there are two consoles?


  Regards,
  Arnout


>
>   # Linux headers same as kernel, a 4.1 series
>   BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_1=y
> @@ -33,4 +33,5 @@ BR2_PACKAGE_HOST_MTOOLS=y
>   BR2_TARGET_ROOTFS_EXT2=y
>   BR2_TARGET_ROOTFS_EXT2_4=y
>   # BR2_TARGET_ROOTFS_TAR is not set
> +BR2_ROOTFS_POST_BUILD_SCRIPT="board/raspberrypi2/post-build.sh"
>   BR2_ROOTFS_POST_IMAGE_SCRIPT="board/raspberrypi2/post-image.sh"
> diff --git a/configs/raspberrypi_defconfig b/configs/raspberrypi_defconfig
> index 3b3cc504c2be..717d798b3851 100644
> --- a/configs/raspberrypi_defconfig
> +++ b/configs/raspberrypi_defconfig
> @@ -2,7 +2,7 @@ BR2_arm=y
>   BR2_arm1176jzf_s=y
>   BR2_ARM_EABIHF=y
>
> -BR2_TARGET_GENERIC_GETTY_PORT="tty1"
> +BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"

>
>   # Linux headers same as kernel, a 4.1 series
>   BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_1=y
> @@ -32,4 +32,5 @@ BR2_PACKAGE_HOST_MTOOLS=y
>   BR2_TARGET_ROOTFS_EXT2=y
>   BR2_TARGET_ROOTFS_EXT2_4=y
>   # BR2_TARGET_ROOTFS_TAR is not set
> +BR2_ROOTFS_POST_BUILD_SCRIPT="board/raspberrypi/post-build.sh"
>   BR2_ROOTFS_POST_IMAGE_SCRIPT="board/raspberrypi/post-image.sh"
> diff --git a/package/rpi-firmware/cmdline.txt b/package/rpi-firmware/cmdline.txt
> index 38aa3782621b..155a54693bff 100644
> --- a/package/rpi-firmware/cmdline.txt
> +++ b/package/rpi-firmware/cmdline.txt
> @@ -1 +1 @@
> -root=/dev/mmcblk0p2 rootwait
> +root=/dev/mmcblk0p2 rootwait console=tty1 console=ttyAMA0,115200
>
Alexander Dahl March 29, 2016, 9:04 p.m. UTC | #4
Hei hei,

On 29.03.2016 16:12, Luca Ceresoli wrote:
> However, when replying to a mail on the mailing list, please reply to
> all. This helps involved people to follow the discussion. Typically an
> e-mail sent directly is seen sooner that one on a mailing list only.

Well, I try to remember it, each community handles this different and I
find it annoying to receive mails twice personally. Some mailing list
filter this, others not. ;-)

> That's OK if you don't feel confident enough to give your official
> Acked-by or Reviewed-by tag. Still, you can test the patch on a real
> board and report back the outcome. If it works, you can add your
> Tested-by tag. Otherwise, please report what went wrong. More details on:

Yeah I actually tried to this evening, but there was a showstopper I
filed a bug for now: https://bugs.busybox.net/show_bug.cgi?id=8831

Maybe I try again later.

Greets
Alex
Luca Ceresoli March 29, 2016, 9:56 p.m. UTC | #5
Dear Arnout,

On 29/03/2016 22:32, Arnout Vandecappelle wrote:
> On 03/29/16 00:08, Luca Ceresoli wrote:
>> The current Buildroot defconfigs for Raspberry Pi and Raspberry Pi 2
>> instantiate a console on tty1, which appears on HDMI. Add a console on
>> the serial port (ttyAMA0) to be more consistent with other defconfigs
>> and provide a better out-of-the-box experience to users used to have a
>> serial console from Buildroot defconfigs.
>>
>> This requires two changes:
>>   1. have two 'console=' entries in the kernel command line;
>>   2. add a new getty process to the generated inittab.
>>
>> Step 2 requires a post-build script since the Buildroot makefiles can
>> configure only one console. But instead of simply adding a new getty
>> on ttyAMA0 (which would work) this patch actually changes
>> BR2_TARGET_GENERIC_GETTY_PORT from tty1 to ttyAMA0, then adds back
>> tty1 via post-build.sh. This is done only to avoid the
>> "GENERIC_SERIAL" comment where we instantiate an HDMI console, then
>> instantiate a really-serial console on another line.
>>
>> The result is these two inittab lines:
>>
>>    ttyAMA0::respawn:/sbin/getty -L  ttyAMA0 0 vt100 # GENERIC_SERIAL
>>    tty1::respawn:/sbin/getty -L  tty1 0 vt100 # HDMI console
>>
>> Cc: Yann E. MORIN <yann.morin.1998@free.fr>
>> Signed-off-by: Luca Ceresoli <luca@lucaceresoli.net>
>>
>> ---
>>
>> Tested on both Raspberry Pi B and Raspberry Pi 2, each on serial and
>> HDMI console.
>> ---
>>   board/raspberrypi/post-build.sh  | 9 +++++++++
>>   configs/raspberrypi2_defconfig   | 3 ++-
>>   configs/raspberrypi_defconfig    | 3 ++-
>>   package/rpi-firmware/cmdline.txt | 2 +-
>>   4 files changed, 14 insertions(+), 3 deletions(-)
>>   create mode 100755 board/raspberrypi/post-build.sh
>>
>> diff --git a/board/raspberrypi/post-build.sh
>> b/board/raspberrypi/post-build.sh
>> new file mode 100755
>> index 000000000000..7eae14a88569
>> --- /dev/null
>> +++ b/board/raspberrypi/post-build.sh
>> @@ -0,0 +1,9 @@
>> +#!/bin/sh
>> +
>> +set -u
>> +set -e
>> +
>> +# Add a console on tty1
>> +grep -qE '^tty1::' ${TARGET_DIR}/etc/inittab || \
>> +sed -i '/GENERIC_SERIAL/a\
>> +tty1::respawn:/sbin/getty -L  tty1 0 vt100 # HDMI console'
>> ${TARGET_DIR}/etc/inittab
>> diff --git a/configs/raspberrypi2_defconfig
>> b/configs/raspberrypi2_defconfig
>> index ce41ee31adba..0ffc6cdaf158 100644
>> --- a/configs/raspberrypi2_defconfig
>> +++ b/configs/raspberrypi2_defconfig
>> @@ -5,7 +5,7 @@ BR2_ARM_FPU_NEON_VFPV4=y
>>
>>   BR2_TOOLCHAIN_BUILDROOT_CXX=y
>>
>> -BR2_TARGET_GENERIC_GETTY_PORT="tty1"
>> +BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"
> 
>  Why not keep the default "console"? That should work, no? Or doesn't
> that work if there are two consoles?

What improvement you expect from using "console" instead of "ttyAMA0"?

OTOH I think ttyAMA0 or tty1 is explicit about the device to use. And as
Yann pointed out on IRC, "console is not a controlling tty, so no Ctrl-C
for example".
Arnout Vandecappelle March 29, 2016, 10:33 p.m. UTC | #6
On 03/29/16 23:04, Alexander Dahl wrote:
> Hei hei,
>
> On 29.03.2016 16:12, Luca Ceresoli wrote:
>> However, when replying to a mail on the mailing list, please reply to
>> all. This helps involved people to follow the discussion. Typically an
>> e-mail sent directly is seen sooner that one on a mailing list only.
>
> Well, I try to remember it, each community handles this different and I
> find it annoying to receive mails twice personally. Some mailing list
> filter this, others not. ;-)
>
>> That's OK if you don't feel confident enough to give your official
>> Acked-by or Reviewed-by tag. Still, you can test the patch on a real
>> board and report back the outcome. If it works, you can add your
>> Tested-by tag. Otherwise, please report what went wrong. More details on:
>
> Yeah I actually tried to this evening, but there was a showstopper I
> filed a bug for now: https://bugs.busybox.net/show_bug.cgi?id=8831

  But that problem has nothing to do with this patch. I expect that if you 
revert the patch, your build will still fail.

  Regards,
  Arnout
Arnout Vandecappelle March 29, 2016, 10:46 p.m. UTC | #7
On 03/29/16 23:56, Luca Ceresoli wrote:
> Dear Arnout,
>
> On 29/03/2016 22:32, Arnout Vandecappelle wrote:
>> On 03/29/16 00:08, Luca Ceresoli wrote:
[snip]
>>> diff --git a/configs/raspberrypi2_defconfig
>>> b/configs/raspberrypi2_defconfig
>>> index ce41ee31adba..0ffc6cdaf158 100644
>>> --- a/configs/raspberrypi2_defconfig
>>> +++ b/configs/raspberrypi2_defconfig
>>> @@ -5,7 +5,7 @@ BR2_ARM_FPU_NEON_VFPV4=y
>>>
>>>    BR2_TOOLCHAIN_BUILDROOT_CXX=y
>>>
>>> -BR2_TARGET_GENERIC_GETTY_PORT="tty1"
>>> +BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"
>>
>>   Why not keep the default "console"? That should work, no? Or doesn't
>> that work if there are two consoles?
>
> What improvement you expect from using "console" instead of "ttyAMA0"?
>
> OTOH I think ttyAMA0 or tty1 is explicit about the device to use. And as
> Yann pointed out on IRC, "console is not a controlling tty, so no Ctrl-C
> for example".

  For the record, as concluded on IRC:

- "console" is still a controlling tty, it is init=/bin/sh that doesn't give a 
controlling tty;

- GETTY_PORT="console" will launch a getty on the last console= given on the 
kernel command line

- What I actually meant is that BR2_TARGET_GENERIC_GETTY_PORT can be removed 
completely from the defconfig (as is the case already in roughly half our 
defconfigs) because it anyway defaults to "console".


  Regards,
  Arnout
Luca Ceresoli March 30, 2016, 12:04 p.m. UTC | #8
Dear Arnout,

On 30/03/2016 00:46, Arnout Vandecappelle wrote:
> On 03/29/16 23:56, Luca Ceresoli wrote:
>> Dear Arnout,
>>
>> On 29/03/2016 22:32, Arnout Vandecappelle wrote:
>>> On 03/29/16 00:08, Luca Ceresoli wrote:
> [snip]
>>>> diff --git a/configs/raspberrypi2_defconfig
>>>> b/configs/raspberrypi2_defconfig
>>>> index ce41ee31adba..0ffc6cdaf158 100644
>>>> --- a/configs/raspberrypi2_defconfig
>>>> +++ b/configs/raspberrypi2_defconfig
>>>> @@ -5,7 +5,7 @@ BR2_ARM_FPU_NEON_VFPV4=y
>>>>
>>>>    BR2_TOOLCHAIN_BUILDROOT_CXX=y
>>>>
>>>> -BR2_TARGET_GENERIC_GETTY_PORT="tty1"
>>>> +BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"
>>>
>>>   Why not keep the default "console"? That should work, no? Or doesn't
>>> that work if there are two consoles?
>>
>> What improvement you expect from using "console" instead of "ttyAMA0"?
>>
>> OTOH I think ttyAMA0 or tty1 is explicit about the device to use. And as
>> Yann pointed out on IRC, "console is not a controlling tty, so no Ctrl-C
>> for example".
> 
>  For the record, as concluded on IRC:
> 
> - "console" is still a controlling tty, it is init=/bin/sh that doesn't
> give a controlling tty;
> 
> - GETTY_PORT="console" will launch a getty on the last console= given on
> the kernel command line
> 
> - What I actually meant is that BR2_TARGET_GENERIC_GETTY_PORT can be
> removed completely from the defconfig (as is the case already in roughly
> half our defconfigs) because it anyway defaults to "console".

Thanks for the recap. Will do in v2.
diff mbox

Patch

diff --git a/board/raspberrypi/post-build.sh b/board/raspberrypi/post-build.sh
new file mode 100755
index 000000000000..7eae14a88569
--- /dev/null
+++ b/board/raspberrypi/post-build.sh
@@ -0,0 +1,9 @@ 
+#!/bin/sh
+
+set -u
+set -e
+
+# Add a console on tty1
+grep -qE '^tty1::' ${TARGET_DIR}/etc/inittab || \
+sed -i '/GENERIC_SERIAL/a\
+tty1::respawn:/sbin/getty -L  tty1 0 vt100 # HDMI console' ${TARGET_DIR}/etc/inittab
diff --git a/configs/raspberrypi2_defconfig b/configs/raspberrypi2_defconfig
index ce41ee31adba..0ffc6cdaf158 100644
--- a/configs/raspberrypi2_defconfig
+++ b/configs/raspberrypi2_defconfig
@@ -5,7 +5,7 @@  BR2_ARM_FPU_NEON_VFPV4=y
 
 BR2_TOOLCHAIN_BUILDROOT_CXX=y
 
-BR2_TARGET_GENERIC_GETTY_PORT="tty1"
+BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"
 
 # Linux headers same as kernel, a 4.1 series
 BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_1=y
@@ -33,4 +33,5 @@  BR2_PACKAGE_HOST_MTOOLS=y
 BR2_TARGET_ROOTFS_EXT2=y
 BR2_TARGET_ROOTFS_EXT2_4=y
 # BR2_TARGET_ROOTFS_TAR is not set
+BR2_ROOTFS_POST_BUILD_SCRIPT="board/raspberrypi2/post-build.sh"
 BR2_ROOTFS_POST_IMAGE_SCRIPT="board/raspberrypi2/post-image.sh"
diff --git a/configs/raspberrypi_defconfig b/configs/raspberrypi_defconfig
index 3b3cc504c2be..717d798b3851 100644
--- a/configs/raspberrypi_defconfig
+++ b/configs/raspberrypi_defconfig
@@ -2,7 +2,7 @@  BR2_arm=y
 BR2_arm1176jzf_s=y
 BR2_ARM_EABIHF=y
 
-BR2_TARGET_GENERIC_GETTY_PORT="tty1"
+BR2_TARGET_GENERIC_GETTY_PORT="ttyAMA0"
 
 # Linux headers same as kernel, a 4.1 series
 BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_1=y
@@ -32,4 +32,5 @@  BR2_PACKAGE_HOST_MTOOLS=y
 BR2_TARGET_ROOTFS_EXT2=y
 BR2_TARGET_ROOTFS_EXT2_4=y
 # BR2_TARGET_ROOTFS_TAR is not set
+BR2_ROOTFS_POST_BUILD_SCRIPT="board/raspberrypi/post-build.sh"
 BR2_ROOTFS_POST_IMAGE_SCRIPT="board/raspberrypi/post-image.sh"
diff --git a/package/rpi-firmware/cmdline.txt b/package/rpi-firmware/cmdline.txt
index 38aa3782621b..155a54693bff 100644
--- a/package/rpi-firmware/cmdline.txt
+++ b/package/rpi-firmware/cmdline.txt
@@ -1 +1 @@ 
-root=/dev/mmcblk0p2 rootwait
+root=/dev/mmcblk0p2 rootwait console=tty1 console=ttyAMA0,115200