From b64288be7cccdc6448da09041eeb6baa54496281 Mon Sep 17 00:00:00 2001 From: Taylor Brown Date: Sat, 5 Mar 2022 15:52:13 -0600 Subject: [PATCH 01/27] Update the .NET installation instructions The previous instructions appeared to make assumptions that the reader had created a donet program before. This change clarifies: * How to create a dotnet project * How to run it and ensure that things are oworking * That you should be in the project directory in order to add the nuget packages * That the nuget packages should not point to the nightly IoT build, but to version 2.1.0 (otherwise in its current state there are errors upon installation) --- .../build-hat/net-installing-software.adoc | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc b/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc index e9494c0fa..e3511af61 100644 --- a/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc +++ b/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc @@ -11,12 +11,25 @@ WARNING: The installation script is run as `root`. You should read it first and $ wget -O - https://raw.githubusercontent.com/pjgpetecodes/dotnet5pi/master/install.sh | sudo bash ---- -After installing the .NET framework you also need to install the nuget packages: +After installing the .NET framework you can create your project: +[.bash] +---- +$ dotnet new console --name buildhat +--- + +This creates a default program in the `buildhat` directory, so we go into that directory and run the program. +It should print `Hello World!` +[.bash] +--- +$ cd buildhat +$ dotnet run +Hello World! +--- +You will now need to install the following nuget packages: [.bash] ---- -$ dotnet add package System.Device.Gpio --source https://pkgs.dev.azure.com/dotnet/IoT/_packaging/nightly_iot_builds/nuget/v3/index.json -$ dotnet add package Iot.Device.Bindings --source https://pkgs.dev.azure.com/dotnet/IoT/_packaging/nightly_iot_builds/nuget/v3/index.json +$ dotnet add package System.Device.Gpio --version 2.1.0 +$ dotnet add package Iot.Device.Bindings --version 2.1.0 ---- -You can now create a project and edit it. From 034577094590731a45101824afa6b2efd2fa9556 Mon Sep 17 00:00:00 2001 From: Taylor Brown Date: Sat, 5 Mar 2022 16:29:02 -0600 Subject: [PATCH 02/27] Fix code formatting for .NET install instructions --- .../accessories/build-hat/net-installing-software.adoc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc b/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc index e3511af61..04a2629d9 100644 --- a/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc +++ b/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc @@ -12,19 +12,21 @@ $ wget -O - https://raw.githubusercontent.com/pjgpetecodes/dotnet5pi/master/inst ---- After installing the .NET framework you can create your project: + [.bash] ---- $ dotnet new console --name buildhat ---- +---- This creates a default program in the `buildhat` directory, so we go into that directory and run the program. It should print `Hello World!` + [.bash] ---- +---- $ cd buildhat $ dotnet run Hello World! ---- +---- You will now need to install the following nuget packages: [.bash] From f59a3773fb8b18a1aa653a7e3f02e81412ca7df4 Mon Sep 17 00:00:00 2001 From: Taylor Brown Date: Sat, 5 Mar 2022 16:59:56 -0600 Subject: [PATCH 03/27] Add instructions for running and editing C# code --- .../build-hat/net-installing-software.adoc | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc b/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc index 04a2629d9..906a8939d 100644 --- a/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc +++ b/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc @@ -18,14 +18,11 @@ After installing the .NET framework you can create your project: $ dotnet new console --name buildhat ---- -This creates a default program in the `buildhat` directory, so we go into that directory and run the program. -It should print `Hello World!` +This creates a default program in the `buildhat` subdirectory, and we need to be in that directory in order to continue: [.bash] ---- $ cd buildhat -$ dotnet run -Hello World! ---- You will now need to install the following nuget packages: @@ -35,3 +32,33 @@ $ dotnet add package System.Device.Gpio --version 2.1.0 $ dotnet add package Iot.Device.Bindings --version 2.1.0 ---- +=== Running C# Code + +You can run the program with the `dotnet run` command. Let's try it now to make sure everything works. +It should print "Hello World!" + +[.bash] +---- +$ dotnet run +Hello World! +---- + +(When instructed to "run the program" in the instructions that follow, you will simply rerun `dotnet run`) + +=== Editing C# Code +In the instructions below, you will be editing the file `buildhat/Program.cs`, the C# program which was generated when you ran the above commands. + +Any text editor will work to edit C# code, including Geany, the IDE/Text Editor that comes pre-installed in Raspbian. However, https://code.visualstudio.com/[Visual Studio Code] (often called "VS Code") is a popular alternative. It can be installed by running: + +[.bash] +---- +$ sudo apt get install code +---- + +Once installed, you can open your current folder in VS Code by running: + +[.bash] +---- +$ code . +---- + From 38d2f660303d072ad630a085daa8b88a1d20ffa3 Mon Sep 17 00:00:00 2001 From: Taylor Brown Date: Sat, 5 Mar 2022 17:12:25 -0600 Subject: [PATCH 04/27] Update the VS Code installation instructions Just reference the official Microsoft documentation. --- .../build-hat/net-installing-software.adoc | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc b/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc index 906a8939d..f0bfe12b3 100644 --- a/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc +++ b/documentation/asciidoc/accessories/build-hat/net-installing-software.adoc @@ -48,17 +48,4 @@ Hello World! === Editing C# Code In the instructions below, you will be editing the file `buildhat/Program.cs`, the C# program which was generated when you ran the above commands. -Any text editor will work to edit C# code, including Geany, the IDE/Text Editor that comes pre-installed in Raspbian. However, https://code.visualstudio.com/[Visual Studio Code] (often called "VS Code") is a popular alternative. It can be installed by running: - -[.bash] ----- -$ sudo apt get install code ----- - -Once installed, you can open your current folder in VS Code by running: - -[.bash] ----- -$ code . ----- - +Any text editor will work to edit C# code, including Geany, the IDE/Text Editor that comes pre-installed. https://code.visualstudio.com/docs/setup/raspberry-pi/[Visual Studio Code] (often called "VS Code") is also a popular alternative. From 2f50ec585830c6119421966a6b269f192f327a54 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Mon, 11 Apr 2022 14:33:14 +0200 Subject: [PATCH 05/27] Update device-tree.adoc Fix the primary uart according to uart.adoc. --- documentation/asciidoc/computers/configuration/device-tree.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/computers/configuration/device-tree.adoc b/documentation/asciidoc/computers/configuration/device-tree.adoc index 89c9fb68e..d41bb8712 100644 --- a/documentation/asciidoc/computers/configuration/device-tree.adoc +++ b/documentation/asciidoc/computers/configuration/device-tree.adoc @@ -980,7 +980,7 @@ This sets an (exclusive) limit to the loaded device tree. By default the device If non-zero, turn on some extra logging for the firmware's device tree processing. `enable_uart` -Enable the primary/console xref:configuration.adoc#configuring-uarts[UART] (ttyS0 on a Raspberry Pi 3, ttyAMA0 otherwise - unless swapped with an overlay such as miniuart-bt). If the primary UART is ttyAMA0 then enable_uart defaults to 1 (enabled), otherwise it defaults to 0 (disabled). This is because it is necessary to stop the core frequency from changing which would make ttyS0 unusable, so `enable_uart=1` implies core_freq=250 (unless force_turbo=1). In some cases this is a performance hit, so it is off by default. +Enable the primary/console xref:configuration.adoc#configuring-uarts[UART] (ttyS0 on a Raspberry Pi 3/4 or Zero W, ttyAMA0 otherwise - unless swapped with an overlay such as miniuart-bt). If the primary UART is ttyAMA0 then enable_uart defaults to 1 (enabled), otherwise it defaults to 0 (disabled). This is because it is necessary to stop the core frequency from changing which would make ttyS0 unusable, so `enable_uart=1` implies core_freq=250 (unless force_turbo=1). In some cases this is a performance hit, so it is off by default. `overlay_prefix` Specifies a subdirectory/prefix from which to load overlays - defaults to "overlays/". Note the trailing "/". If desired you can add something after the final "/" to add a prefix to each file, although this is not likely to be needed. From e9b444809f38d631cd54c9bb6ca4db17d4b80659 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Mon, 11 Apr 2022 15:39:10 +0200 Subject: [PATCH 06/27] Update documentation/asciidoc/computers/configuration/device-tree.adoc Co-authored-by: RuffaloLavoisier --- documentation/asciidoc/computers/configuration/device-tree.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/computers/configuration/device-tree.adoc b/documentation/asciidoc/computers/configuration/device-tree.adoc index d41bb8712..e38ae2692 100644 --- a/documentation/asciidoc/computers/configuration/device-tree.adoc +++ b/documentation/asciidoc/computers/configuration/device-tree.adoc @@ -980,7 +980,7 @@ This sets an (exclusive) limit to the loaded device tree. By default the device If non-zero, turn on some extra logging for the firmware's device tree processing. `enable_uart` -Enable the primary/console xref:configuration.adoc#configuring-uarts[UART] (ttyS0 on a Raspberry Pi 3/4 or Zero W, ttyAMA0 otherwise - unless swapped with an overlay such as miniuart-bt). If the primary UART is ttyAMA0 then enable_uart defaults to 1 (enabled), otherwise it defaults to 0 (disabled). This is because it is necessary to stop the core frequency from changing which would make ttyS0 unusable, so `enable_uart=1` implies core_freq=250 (unless force_turbo=1). In some cases this is a performance hit, so it is off by default. +Enable the primary/console xref:configuration.adoc#configuring-uarts[UART] (ttyS0 on a Raspberry Pi 3, 4 and Zero W, ttyAMA0 otherwise - unless swapped with an overlay such as miniuart-bt). If the primary UART is ttyAMA0 then `enable_uart` defaults to 1 (enabled), otherwise it defaults to 0 (disabled). This is because it is necessary to stop the core frequency from changing which would make ttyS0 unusable, so `enable_uart=1` implies `core_freq=250` (unless `force_turbo=1`). In some cases this is a performance hit, so it is off by default. `overlay_prefix` Specifies a subdirectory/prefix from which to load overlays - defaults to "overlays/". Note the trailing "/". If desired you can add something after the final "/" to add a prefix to each file, although this is not likely to be needed. From eebd347bd6b480f4ac69fdadb7c3a4a6e96de140 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 12 Apr 2022 16:39:20 +0200 Subject: [PATCH 07/27] Update documentation/asciidoc/computers/configuration/device-tree.adoc --- documentation/asciidoc/computers/configuration/device-tree.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/computers/configuration/device-tree.adoc b/documentation/asciidoc/computers/configuration/device-tree.adoc index e38ae2692..7a961173c 100644 --- a/documentation/asciidoc/computers/configuration/device-tree.adoc +++ b/documentation/asciidoc/computers/configuration/device-tree.adoc @@ -980,7 +980,7 @@ This sets an (exclusive) limit to the loaded device tree. By default the device If non-zero, turn on some extra logging for the firmware's device tree processing. `enable_uart` -Enable the primary/console xref:configuration.adoc#configuring-uarts[UART] (ttyS0 on a Raspberry Pi 3, 4 and Zero W, ttyAMA0 otherwise - unless swapped with an overlay such as miniuart-bt). If the primary UART is ttyAMA0 then `enable_uart` defaults to 1 (enabled), otherwise it defaults to 0 (disabled). This is because it is necessary to stop the core frequency from changing which would make ttyS0 unusable, so `enable_uart=1` implies `core_freq=250` (unless `force_turbo=1`). In some cases this is a performance hit, so it is off by default. +Enable the primary/console xref:configuration.adoc#configuring-uarts[UART] (ttyS0 on a Raspberry Pi 3, 4, 400, Zero W and Zero 2 W, ttyAMA0 otherwise - unless swapped with an overlay such as miniuart-bt). If the primary UART is ttyAMA0 then `enable_uart` defaults to 1 (enabled), otherwise it defaults to 0 (disabled). This is because it is necessary to stop the core frequency from changing which would make ttyS0 unusable, so `enable_uart=1` implies `core_freq=250` (unless `force_turbo=1`). In some cases this is a performance hit, so it is off by default. `overlay_prefix` Specifies a subdirectory/prefix from which to load overlays - defaults to "overlays/". Note the trailing "/". If desired you can add something after the final "/" to add a prefix to each file, although this is not likely to be needed. From 96d947ea3dcece2fe8317e5e207fa74a80e62ab5 Mon Sep 17 00:00:00 2001 From: Alasdair Allan Date: Sun, 24 Apr 2022 15:23:01 +0100 Subject: [PATCH 08/27] Deleted all non-Imager installation paths --- .../asciidoc/computers/getting-started.adoc | 11 +-- .../installing-from-an-image.adoc | 2 +- .../installing-from-chromeos.adoc | 14 --- .../installing-from-linux.adoc | 89 ------------------- .../getting-started/installing-from-mac.adoc | 84 ----------------- .../installing-from-windows.adoc | 32 ------- 6 files changed, 2 insertions(+), 230 deletions(-) delete mode 100644 documentation/asciidoc/computers/getting-started/installing-from-chromeos.adoc delete mode 100644 documentation/asciidoc/computers/getting-started/installing-from-linux.adoc delete mode 100644 documentation/asciidoc/computers/getting-started/installing-from-mac.adoc delete mode 100644 documentation/asciidoc/computers/getting-started/installing-from-windows.adoc diff --git a/documentation/asciidoc/computers/getting-started.adoc b/documentation/asciidoc/computers/getting-started.adoc index 25c64d2c3..66e2c8b6d 100644 --- a/documentation/asciidoc/computers/getting-started.adoc +++ b/documentation/asciidoc/computers/getting-started.adoc @@ -2,15 +2,6 @@ include::getting-started/setting-up.adoc[] include::getting-started/installing-from-an-image.adoc[] -include::getting-started/configuring.adoc[] - include::getting-started/network-installation.adoc[] -include::getting-started/installing-from-chromeos.adoc[] - -include::getting-started/installing-from-linux.adoc[] - -include::getting-started/installing-from-mac.adoc[] - -include::getting-started/installing-from-windows.adoc[] - +include::getting-started/configuring.adoc[] diff --git a/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc b/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc index 00a7018ef..3f5daac59 100644 --- a/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc +++ b/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc @@ -1,6 +1,6 @@ == Installing the Operating System -Raspberry Pi recommend the use of https://www.raspberrypi.com/software/[Raspberry Pi Imager] to install an operating system on your SD card. You will need another computer with an SD card reader to install the image. +Raspberry Pi recommend the use of https://www.raspberrypi.com/software/[Raspberry Pi Imager] to install an operating system on your SD card. You will need another computer with an SD card reader to install the image. Rapsberry Pi Imager can be run on another Raspberry Pi, but also works on Microsoft Windows, Apple macOS, and Linux. NOTE: Before you start, don't forget to check the xref:getting-started.adoc#sd-cards[SD card requirements]. diff --git a/documentation/asciidoc/computers/getting-started/installing-from-chromeos.adoc b/documentation/asciidoc/computers/getting-started/installing-from-chromeos.adoc deleted file mode 100644 index 94639e75e..000000000 --- a/documentation/asciidoc/computers/getting-started/installing-from-chromeos.adoc +++ /dev/null @@ -1,14 +0,0 @@ -== Installing Images on Chrome OS - -The easiest way to write images to an SD card and USB drives with Chrome OS is to use the official https://chrome.google.com/webstore/detail/chromebook-recovery-utili/jndclpdbaamdhonoechobihbbiimdgai[Chromebook Recovery Utility]. It can be used to create Chromebook Recovery media, and it will also accept `.zip` files containing images. - -* Download the https://chrome.google.com/webstore/detail/chromebook-recovery-utili/pocpnlppkickgojjlmhdmidojbmbodfm[Chromebook Recovery Utility]. -* Download the https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-32-bit[Raspberry Pi OS] zip archive. -* Launch the *Recovery Utility* -* Click on the *Settings Gears* icon in the upper right-hand corner, next to the window close icon. -* Select the *Use Local Image* option. -* Choose the `.zip` file you downloaded. -* Insert the SD card and click *Continue*. -* Read the warning and click the *Create now* button. -* Wait for the progress bar to complete twice (for unpacking and writing). This might take a few minutes. Once the process is complete, a big green checkmark will be shown. -* Close the program and eject the card. diff --git a/documentation/asciidoc/computers/getting-started/installing-from-linux.adoc b/documentation/asciidoc/computers/getting-started/installing-from-linux.adoc deleted file mode 100644 index 787d72130..000000000 --- a/documentation/asciidoc/computers/getting-started/installing-from-linux.adoc +++ /dev/null @@ -1,89 +0,0 @@ -== Installing Images on Linux - -xref:getting-started.adoc#using-raspberry-pi-imager[Raspberry Pi Imager] is typically the easiest option for most users to write images to SD cards, so it is a good place to start. If you're looking for more advanced options on Linux, you can use the standard command line tools below. - -NOTE: Using the `dd` tool can overwrite any partition of your machine. If you specify the wrong device when using `dd`, you could delete your primary Linux partition. Please be careful. - -[discrete] -==== Discovering the SD card mountpoint and unmounting it - -* Run `lsblk -p` to see which devices are currently connected to your machine. -* If your computer has a slot for SD cards, insert the card. If not, insert the card into an SD card reader, then connect the reader to your computer. -* Run `lsblk -p` again. The new device that has appeared is your SD card (you can also usually tell from the listed device size). The naming of the device will follow the format described in the next paragraph. -* The left column of the results from the `lsblk -p` command gives the device name of your SD card and the names of any partitions on it (usually only one, but there may be several if the card was previously used). It will be listed as something like `/dev/mmcblk0` or `/dev/sdX` (with partition names `/dev/mmcblk0p1` or `/dev/sdX1` respectively), where `X` is a lower-case letter indicating the device (eg. `/dev/sdb1`). The right column shows where the partitions have been mounted (if they haven't been, it will be blank). -* If any partitions on the SD card have been mounted, unmount them all with `umount`, for example `umount /dev/sdX1` (replace `sdX1` with your SD card's device name, and change the number for any other partitions). - -[discrete] -==== Copying the image to the SD card - -* In a terminal window, write the image to the card with the command below, making sure you replace the input file `if=` argument with the path to your `.img` file, and the `/dev/sdX` in the output file `of=` argument with the correct device name. *This is very important, as you will lose all the data on the hard drive if you provide the wrong device name.* Make sure the device name is the name of the whole SD card as described above, not just a partition. For example: `sdd`, not `sdds1` or `sddp1`; `mmcblk0`, not `mmcblk0p1`. -+ -[,bash] ----- -sudo dd if=2021-10-30-raspios-bullseye-armhf.img of=/dev/sdX bs=4M conv=fsync ----- - -* Please note that block size set to `4M` will work most of the time. If not, try `1M`, although this will take considerably longer. - -[discrete] -==== Copying a zipped image to the SD card - -In Linux it is possible to combine the unzip and SD copying process into one command, which avoids any issues that might occur when the unzipped image is larger than 4GB. This can happen on certain filesystems that do not support files larger than 4GB (e.g. FAT), although it should be noted that most Linux installations do not use FAT and therefore do not have this limitation. - -The following command unzips the zip file (replace 2021-10-30-raspios-bullseye-armhf.zip with the appropriate zip filename), and pipes the output directly to the dd command. This in turn copies it to the SD card, as described in the previous section. - ----- -unzip -p 2021-10-30-raspios-bullseye-armhf.zip | sudo dd of=/dev/sdX bs=4M conv=fsync ----- - -[discrete] -==== Checking the image copy progress - -* By default, the `dd` command does not give any information about its progress, so it may appear to have frozen. It can take more some time to finish writing to the card. If your card reader has an LED, it may blink during the write process. -* To see the progress of the copy operation, you can run the dd command with the status option. -+ ----- - sudo dd if=2021-10-30-raspios-bullseye-armhf.img of=/dev/sdX bs=4M conv=fsync status=progress ----- - -* If you are using an older version of `dd`, the status option may not be available. You may be able to use the `dcfldd` command instead, which will give a progress report showing how much has been written. Another method is to send a USR1 signal to `dd`, which will let it print status information. Find out the PID of `dd` by using `pgrep -l dd` or `ps a | grep dd`. Then use `kill -USR1 PID` to send the USR1 signal to `dd`. - -[discrete] -==== Optional: checking whether the image was correctly written to the SD card - -* After `dd` has finished copying, you can check what has been written to the SD card by `dd`-ing from the card back to another image on your hard disk, truncating the new image to the same size as the original, and then running `diff` (or `md5sum`) on those two images. -* If the SD card is much larger than the image, you don't want to read back the whole SD card, since it will be mostly empty. So you need to check the number of blocks that were written to the card by the `dd` command. At the end of its run, `dd` will have displayed the number of blocks written as follow: -+ ----- -xxx+0 records in -yyy+0 records out -yyyyyyyyyy bytes (yyy kB, yyy KiB) copied, 0.00144744 s, 283 MB/s ----- -+ -We need the number `xxx`, which is the block count. We can ignore the `yyy` numbers. - -* Copy the SD card content to an image on your hard drive using `dd` again: -+ -[,bash] ----- -sudo dd if=/dev/sdX of=from-sd-card.img bs=4M count=xxx ----- -+ -`if` is the input file (i.e. the SD card device), `of` is the output file to which the SD card content is to be copied (called `from-sd-card.img` in this example), and `xxx` is the number of blocks written by the original `dd` operation. - -* In case the SD card image is still larger than the original image, truncate the new image to the size of the original image using the following command (replace the input file `reference` argument with the original image name): -+ -[,bash] ----- -truncate --reference 2021-10-30-raspios-bullseye-armhf.img from-sd-card.img ----- - -* Compare the two images: `diff` should report that the files are identical. -+ -[,bash] ----- -diff -s from-sd-card.img 2021-10-30-raspios-bullseye-armhf.img ----- - -* Run `sync`. This will ensure that the write cache is flushed and that it is safe to unmount your SD card. -* Remove the SD card from the card reader. diff --git a/documentation/asciidoc/computers/getting-started/installing-from-mac.adoc b/documentation/asciidoc/computers/getting-started/installing-from-mac.adoc deleted file mode 100644 index 7384b9b14..000000000 --- a/documentation/asciidoc/computers/getting-started/installing-from-mac.adoc +++ /dev/null @@ -1,84 +0,0 @@ -== Installing Images on Mac OS - -xref:getting-started.adoc#using-raspberry-pi-imager[Raspberry Pi Imager] is the recommended option for most users to write images to SD cards. However, if you do not want to use the Imager you can still copy an operating system to the card from the command line. - -[discrete] -==== Finding the SD Card - -Insert the SD card in the slot, or connect the SD card reader with the SD card inside, and type `diskutil list` at the command line. You should see something like this, - -[source,bash] ----- - /dev/disk0 (internal): - #: TYPE NAME SIZE IDENTIFIER - 0: GUID_partition_scheme 500.3 GB disk0 - 1: EFI EFI 314.6 MB disk0s1 - 2: Apple_APFS Container disk1 500.0 GB disk0s2 - - /dev/disk1 (synthesized): - #: TYPE NAME SIZE IDENTIFIER - 0: APFS Container Scheme - +500.0 GB disk1 - Physical Store disk0s2 - 1: APFS Volume Macintosh HD 89.6 GB disk1s1 - 2: APFS Volume Preboot 47.3 MB disk1s2 - 3: APFS Volume Recovery 510.4 MB disk1s3 - 4: APFS Volume VM 3.6 GB disk1s4 - - /dev/disk2 (external, physical): - #: TYPE NAME SIZE IDENTIFIER - 0: FDisk_partition_scheme *15.9 GB disk2 - 1: Windows_FAT_32 boot 268.4 MB disk2s1 - 2: Linux 15.7 GB disk2s2 ----- - -Here the SD Card is `/dev/disk2` however your disk and partition list may vary. - -[discrete] -==== Copying the Image - -WARNING: Using the `dd` command line tool can overwrite your Mac's operating system if you specify the wrong disk device. If you're not sure about what to do, we recommend you use the https://www.raspberrypi.com/software/[Raspberry Pi Imager] tool. - -Before copying the image you should unmount the SD Card. - -[source,bash] ----- -diskutil unmountDisk /dev/diskN ----- - -You can then copy the image, - -[source,bash] ----- -sudo dd bs=1m if=path_of_your_image.img of=/dev/rdiskN; sync ----- - -replacing `N` with the disk number. - -NOTE: You should use `rdisk` (which stands for 'raw disk') instead of `disk`, this speeds up the copying. - -This can take a few minutes, depending on the image file size. You can check the progress by pressing `Ctrl+T`. After the `dd` command finishes, you can eject the card: - -[source,bash] ----- -sudo diskutil eject /dev/rdiskN ----- - -[discrete] -==== Troubleshooting - -* If the command reports `dd: /dev/rdiskN: Resource busy`, you need to unmount the volume first `sudo diskutil unmountDisk /dev/diskN`. - -* If the command reports `dd: bs: illegal numeric value`, change the block size `bs=1m` to `bs=1M`. - -* If the command reports `dd: /dev/rdiskN: Operation not permitted`, go to `System Preferences` \-> `Security & Privacy` \-> `Privacy` \-> `Files and Folders` \-> `Give Removable Volumes access to Terminal`. - -* If the command reports `dd: /dev/rdiskN: Permission denied`, the partition table of the SD card is being protected against being overwritten by mac OS. -+ -Erase the SD card's partition table using this command: -+ -[source,bash] ----- -sudo diskutil partitionDisk /dev/diskN 1 MBR "Free Space" "%noformat%" 100% ----- -+ -That command will also set the permissions on the device to allow writing. diff --git a/documentation/asciidoc/computers/getting-started/installing-from-windows.adoc b/documentation/asciidoc/computers/getting-started/installing-from-windows.adoc deleted file mode 100644 index e2a955473..000000000 --- a/documentation/asciidoc/computers/getting-started/installing-from-windows.adoc +++ /dev/null @@ -1,32 +0,0 @@ -== Installing Images on Windows - -xref:getting-started.adoc#using-raspberry-pi-imager[Raspberry Pi Imager] is our recommended option for most users to write images to SD cards, so it is a good place to start. If you're looking for an alternative on Windows, you can use balenaEtcher, Win32DiskImager or imgFlasher. - -[discrete] -==== balenaEtcher - -* Download the Windows installer from https://www.balena.io/etcher/[balena.io] -* Run balenaEtcher and select the unzipped Raspberry Pi OS image file -* Select the SD card drive -* Finally, click *Burn* to write the Raspberry Pi OS image to the SD card -* You'll see a progress bar. Once complete, the utility will automatically unmount the SD card so it's safe to remove it from your computer. - -[discrete] -==== Win32DiskImager - -* Insert the SD card into your SD card reader. You can use the SD card slot if you have one, or an SD adapter in a USB port. Note the drive letter assigned to the SD card. You can see the drive letter in the left hand column of Windows Explorer, for example *G:* -* Download the Win32DiskImager utility from the http://sourceforge.net/projects/win32diskimager/[Sourceforge Project page] as an installer file, and run it to install the software. -* Run the `Win32DiskImager` utility from your desktop or menu. -* Select the image file you extracted earlier. -* In the device box, select the drive letter of the SD card. Be careful to select the correct drive: if you choose the wrong drive you could destroy the data on your computer's hard disk! If you are using an SD card slot in your computer, and can't see the drive in the Win32DiskImager window, try using an external SD adapter. -* Click 'Write' and wait for the write to complete. -* Exit the imager and eject the SD card. - -[discrete] -==== Upswift imgFlasher - -* Download portable Windows version from https://www.upswift.io/imgflasher/[upswift.io] -* Run imgFlasher and choose an image or zip file -* Choose SD card or USB drive -* Click on 'Flash' -* Wait until the flash is completed. From 7a172e080b70fecf2277f3aec794cdc575a99dec Mon Sep 17 00:00:00 2001 From: Alasdair Allan Date: Sun, 24 Apr 2022 15:26:20 +0100 Subject: [PATCH 09/27] Cleaned up reference to deleted section --- .../asciidoc/computers/compute-module/cm-emmc-flashing.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/computers/compute-module/cm-emmc-flashing.adoc b/documentation/asciidoc/computers/compute-module/cm-emmc-flashing.adoc index 4b141367a..7608df8d7 100644 --- a/documentation/asciidoc/computers/compute-module/cm-emmc-flashing.adoc +++ b/documentation/asciidoc/computers/compute-module/cm-emmc-flashing.adoc @@ -101,7 +101,7 @@ For more information run ==== Writing to the eMMC (Windows) -After `rpiboot` completes, a new USB mass storage drive will appear in Windows. We recommend following this xref:getting-started.adoc#installing-images-on-windows[guide] and using Win32DiskImager to write images to the drive, rather than trying to use `/dev/sda` etc. from Cygwin. +After `rpiboot` completes, a new USB mass storage drive will appear in Windows. We recommend using https://www.raspberrypi.com/software/[Raspberry Pi Imager] to write images to the drive, rather than trying to use `/dev/sda` etc. from Cygwin. Make sure J4 (USB SLAVE BOOT ENABLE) / J2 (nRPI_BOOT) is set to the disabled position and/or nothing is plugged into the USB slave port. Power cycling the IO board should now result in the Compute Module booting from eMMC. From be3090af3e005152f93990492c7d7c476614614d Mon Sep 17 00:00:00 2001 From: Alasdair Allan Date: Sun, 24 Apr 2022 15:38:27 +0100 Subject: [PATCH 10/27] Removed the 'Using Linux' section entirely --- .../build-hat/py-installing-software.adoc | 2 +- .../config_txt/what_is_config_txt.adoc | 2 +- .../computers/configuration/raspi-config.adoc | 4 +- .../securing-the-raspberry-pi.adoc | 2 +- .../asciidoc/computers/os/using-python.adoc | 2 +- .../computers/remote-access/secure-shell.adoc | 2 +- .../asciidoc/computers/using_linux.adoc | 20 --- .../using_linux/filesystem-home.adoc | 16 -- .../computers/using_linux/images/lsresult.png | Bin 69722 -> 0 bytes .../computers/using_linux/images/terminal.png | Bin 23466 -> 0 bytes .../computers/using_linux/linux-bash.adoc | 52 ------ .../computers/using_linux/linux-crontab.adoc | 76 --------- .../using_linux/linux-multiple-users.adoc | 40 ----- .../using_linux/linux-root-user.adoc | 38 ----- .../using_linux/linux-scripting.adoc | 21 --- .../computers/using_linux/linux-systemd.adoc | 60 ------- .../using_linux/linux-using-commands.adoc | 157 ------------------ .../using_linux/linux-using-text-editors.adoc | 57 ------- .../using_linux/using-the-terminal.adoc | 64 ------- documentation/index.json | 6 - 20 files changed, 8 insertions(+), 613 deletions(-) delete mode 100644 documentation/asciidoc/computers/using_linux.adoc delete mode 100644 documentation/asciidoc/computers/using_linux/filesystem-home.adoc delete mode 100644 documentation/asciidoc/computers/using_linux/images/lsresult.png delete mode 100644 documentation/asciidoc/computers/using_linux/images/terminal.png delete mode 100644 documentation/asciidoc/computers/using_linux/linux-bash.adoc delete mode 100644 documentation/asciidoc/computers/using_linux/linux-crontab.adoc delete mode 100644 documentation/asciidoc/computers/using_linux/linux-multiple-users.adoc delete mode 100644 documentation/asciidoc/computers/using_linux/linux-root-user.adoc delete mode 100644 documentation/asciidoc/computers/using_linux/linux-scripting.adoc delete mode 100644 documentation/asciidoc/computers/using_linux/linux-systemd.adoc delete mode 100644 documentation/asciidoc/computers/using_linux/linux-using-commands.adoc delete mode 100644 documentation/asciidoc/computers/using_linux/linux-using-text-editors.adoc delete mode 100644 documentation/asciidoc/computers/using_linux/using-the-terminal.adoc diff --git a/documentation/asciidoc/accessories/build-hat/py-installing-software.adoc b/documentation/asciidoc/accessories/build-hat/py-installing-software.adoc index 1aacf9956..5279062a3 100644 --- a/documentation/asciidoc/accessories/build-hat/py-installing-software.adoc +++ b/documentation/asciidoc/accessories/build-hat/py-installing-software.adoc @@ -2,7 +2,7 @@ === Installing the Python Library -Install the Build HAT Python library. Open xref:../computers/using_linux.adoc#terminal[a Terminal window] and type, +Install the Build HAT Python library. Open a Terminal window and type, [source] ---- diff --git a/documentation/asciidoc/computers/config_txt/what_is_config_txt.adoc b/documentation/asciidoc/computers/config_txt/what_is_config_txt.adoc index e77e635e0..76e09cb04 100644 --- a/documentation/asciidoc/computers/config_txt/what_is_config_txt.adoc +++ b/documentation/asciidoc/computers/config_txt/what_is_config_txt.adoc @@ -1,6 +1,6 @@ == What is `config.txt`? -The Raspberry Pi uses a configuration file instead of the https://en.wikipedia.org/wiki/BIOS[BIOS] you would expect to find on a conventional PC. The system configuration parameters, which would traditionally be edited and stored using a BIOS, are stored instead in an optional text file named `config.txt`. This is read by the GPU before the ARM CPU and Linux are initialised. It must therefore be located on the first (boot) partition of your SD card, alongside `bootcode.bin` and `start.elf`. This file is normally accessible as `/boot/config.txt` from Linux, and must be edited as xref:using_linux.adoc#root-and-sudo[root]. From Windows or OS X it is visible as a file in the only accessible part of the card. If you need to apply some of the config settings below, but you don't have a `config.txt` on your boot partition yet, simply create it as a new text file. +The Raspberry Pi uses a configuration file instead of the https://en.wikipedia.org/wiki/BIOS[BIOS] you would expect to find on a conventional PC. The system configuration parameters, which would traditionally be edited and stored using a BIOS, are stored instead in an optional text file named `config.txt`. This is read by the GPU before the ARM CPU and Linux are initialised. It must therefore be located on the first (boot) partition of your SD card, alongside `bootcode.bin` and `start.elf`. This file is normally accessible as `/boot/config.txt` from Linux, and must be edited as the `root` user. From Windows or OS X it is visible as a file in the only accessible part of the card. If you need to apply some of the config settings below, but you don't have a `config.txt` on your boot partition yet, simply create it as a new text file. Any changes will only take effect after you have rebooted your Raspberry Pi. After Linux has booted, you can view the current active settings using the following commands: diff --git a/documentation/asciidoc/computers/configuration/raspi-config.adoc b/documentation/asciidoc/computers/configuration/raspi-config.adoc index 34017f341..50213d150 100644 --- a/documentation/asciidoc/computers/configuration/raspi-config.adoc +++ b/documentation/asciidoc/computers/configuration/raspi-config.adoc @@ -43,7 +43,9 @@ Specify the audio output destination. [[change-user-password]] ===== Password -The default user on Raspberry Pi OS is `pi` with the password `raspberry`. You can change that here. Read about other xref:using_linux.adoc#linux-users[users]. +You can change the 'default' user password. + +NOTE: Until recently the default user on Raspberry Pi OS is `pi` with the password `raspberry`. The default user is now set on first boot using a configuration wizard. [[hostname]] ===== Hostname diff --git a/documentation/asciidoc/computers/configuration/securing-the-raspberry-pi.adoc b/documentation/asciidoc/computers/configuration/securing-the-raspberry-pi.adoc index 2aa44b3a1..d1da655b7 100644 --- a/documentation/asciidoc/computers/configuration/securing-the-raspberry-pi.adoc +++ b/documentation/asciidoc/computers/configuration/securing-the-raspberry-pi.adoc @@ -111,7 +111,7 @@ NOTE: Choosing option 'Q' will save the file with any syntax errors still in pla An up-to-date distribution contains all the latest security fixes, so you should go ahead and xref:os.adoc#updating-and-upgrading-raspberry-pi-os[update] your version of Raspberry Pi OS to the latest version. -If you are using SSH to connect to your Raspberry Pi, it can be worthwhile to xref:using_linux.adoc#scheduling-tasks-with-cron[add a cron job] that specifically updates the ssh-server. The following command, perhaps as a daily cron job, will ensure you have the latest SSH security fixes promptly, independent of your normal update process. +If you are using SSH to connect to your Raspberry Pi, it can be worthwhile to add a `cron` job that specifically updates the ssh-server. The following command, perhaps as a daily cron job, will ensure you have the latest SSH security fixes promptly, independent of your normal update process. [,bash] ---- diff --git a/documentation/asciidoc/computers/os/using-python.adoc b/documentation/asciidoc/computers/os/using-python.adoc index 72f5142e3..dc76a9511 100644 --- a/documentation/asciidoc/computers/os/using-python.adoc +++ b/documentation/asciidoc/computers/os/using-python.adoc @@ -244,7 +244,7 @@ Then save this file (`File > Save` or `Ctrl + S`) and run (`Run > Run Module` or === Using the Command Line -You can write a Python file in a standard xref:using_linux.adoc#text-editors[editor], and run it as a Python script from the command line. Just navigate to the directory the file is saved in (use `cd` and `ls` for guidance) and run with `python3`, e.g. `python3 hello.py`. +You can write a Python file in a standard editor, and run it as a Python script from the command line. Just navigate to the directory the file is saved in (use `cd` and `ls` for guidance) and run with `python3`, e.g. `python3 hello.py`. image::images/run-python.png[Python command line] diff --git a/documentation/asciidoc/computers/remote-access/secure-shell.adoc b/documentation/asciidoc/computers/remote-access/secure-shell.adoc index 2b3852315..fd17631a5 100644 --- a/documentation/asciidoc/computers/remote-access/secure-shell.adoc +++ b/documentation/asciidoc/computers/remote-access/secure-shell.adoc @@ -31,4 +31,4 @@ Alternatively you can enable it from the terminal using the xref:configuration.a NOTE: For headless setup, SSH can be enabled by placing a file named `ssh`, without any extension, onto the boot partition of the SD Card. When the Raspberry Pi boots, it looks for the `ssh` file. If it is found, SSH is enabled and the file is deleted. The content of the file does not matter; it could contain text, or nothing at all. -WARNING: When enabling SSH on a Raspberry Pi that may be connected to the internet, you should xref:using_linux.adoc#changing-your-password[change the default password] to ensure that it remains secure. +WARNING: When enabling SSH on a Raspberry Pi that may be connected to the internet, you should ensure that your password is not easily brute forced. diff --git a/documentation/asciidoc/computers/using_linux.adoc b/documentation/asciidoc/computers/using_linux.adoc deleted file mode 100644 index 60fcca31e..000000000 --- a/documentation/asciidoc/computers/using_linux.adoc +++ /dev/null @@ -1,20 +0,0 @@ -include::using_linux/using-the-terminal.adoc[] - -include::using_linux/filesystem-home.adoc[] - -include::using_linux/linux-using-commands.adoc[] - -include::using_linux/linux-using-text-editors.adoc[] - -include::using_linux/linux-multiple-users.adoc[] - -include::using_linux/linux-root-user.adoc[] - -include::using_linux/linux-bash.adoc[] - -include::using_linux/linux-scripting.adoc[] - -include::using_linux/linux-crontab.adoc[] - -include::using_linux/linux-systemd.adoc[] - diff --git a/documentation/asciidoc/computers/using_linux/filesystem-home.adoc b/documentation/asciidoc/computers/using_linux/filesystem-home.adoc deleted file mode 100644 index 7910d118b..000000000 --- a/documentation/asciidoc/computers/using_linux/filesystem-home.adoc +++ /dev/null @@ -1,16 +0,0 @@ -== The Linux File System - -It is important to have a basic understanding of the fundamentals of the Linux file system: where your files are kept, where software is installed, where the danger zones are, and so on. For more information, please refer to the Linux https://wiki.debian.org/FilesystemHierarchyStandard[Filesystem Hierarchy Standard]. - -=== Home - -When you log into a Raspberry Pi and open a terminal window, or you boot to the command line instead of the graphical user interface, you start in your home folder; this is located at `/home/pi`, assuming your username is `pi`. - -This is where the user's own files are kept. The contents of the user's desktop is in a directory here called `Desktop`, along with other files and folders. - -To navigate to your home folder on the command line, simply type `cd` and press `Enter`. This is the equivalent of typing `cd /home/pi`, where `pi` is your username. You can also use the tilde key (`~`), for example `cd ~`, which can be used to relatively link back to your home folder. For instance, `cd ~/Desktop/` is the same as `cd /home/pi/Desktop`. - -Navigate to `/home/` and run `ls`, and you'll see the home folders of each of the users on the system. - -Note that if logged in as the root user, typing `cd` or `cd ~` will take you to the xref:using_linux.adoc#root-and-sudo[root] user's home directory; unlike normal users, this is located at `/root/` not `/home/root/`. - diff --git a/documentation/asciidoc/computers/using_linux/images/lsresult.png b/documentation/asciidoc/computers/using_linux/images/lsresult.png deleted file mode 100644 index 10f34a161a49a11f1d5eed8ebd6c2f97078ba0c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69722 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 diff --git a/documentation/asciidoc/computers/using_linux/linux-bash.adoc b/documentation/asciidoc/computers/using_linux/linux-bash.adoc deleted file mode 100644 index 9332c8cc5..000000000 --- a/documentation/asciidoc/computers/using_linux/linux-bash.adoc +++ /dev/null @@ -1,52 +0,0 @@ -== The `.bashrc` File - -In your home folder you will find a hidden file called `.bashrc` which contains some user configuration options. You can edit this file to suit your needs. Changes made in this file will be actioned the next time a terminal is opened, since that is when the `.bashrc` file is read. - -If you want your changes to take place in your current terminal, you can use either `source ~/.bashrc` or `exec bash`. These actually do slightly different things: the former simply re-executes the `.bashrc` file, which may result in undesirable changes to things like the path, the latter replaces the current shell with a new bash shell, which resets the shell back to the state at login, throwing away any shell variables you may have set. Choose whichever is most appropriate. - -Some useful adaptions are provided for you; some of these are commented out with a `#` by default. To enable them, remove the `#` and they will be active next time you boot your Raspberry Pi or start a new terminal. - -For example, some `ls` aliases: - ----- -alias ls='ls --color=auto' -#alias dir='dir --color=auto' -#alias vdir='vdir --color=auto' - -alias grep='grep --color=auto' -alias fgrep='fgrep --color=auto' -alias egrep='egrep --color=auto' ----- - -Aliases like these are provided to help users of other systems like Microsoft Windows (`dir` is the `ls` of DOS/Windows). Others are to add colour to the output of commands like `ls` and `grep` by default. - -More variations of `ls` are also provided: - ----- -# some more ls aliases -#alias ll='ls -l' -#alias la='ls -A' -#alias l='ls -CF' ----- - -Ubuntu users may be familiar with these as they are provided by default on that distribution. Uncomment these lines to have access to these aliases in future. - -=== The `.bash_aliases` File - -`.bashrc` also contains a reference to a `.bash_aliases` file, which does not exist by default. You can add it to provide a handy way of keeping all your aliases in a separate file. - ----- -if [ -f ~/.bash_aliases ]; then - . ~/.bash_aliases -fi ----- - -The `if` statement here checks the file exists before including it. - -Then you just create the file `.bash_aliases` and add more aliases like so: - ----- -alias gs='git status' ----- - -You can add other things directly to this file, or to another and include that file like the `.bash_aliases` example above. diff --git a/documentation/asciidoc/computers/using_linux/linux-crontab.adoc b/documentation/asciidoc/computers/using_linux/linux-crontab.adoc deleted file mode 100644 index 06a7dd543..000000000 --- a/documentation/asciidoc/computers/using_linux/linux-crontab.adoc +++ /dev/null @@ -1,76 +0,0 @@ -== Scheduling Tasks with Cron - -Cron is a tool for configuring scheduled tasks on Unix systems. It is used to schedule commands or scripts to run periodically and at fixed intervals. Tasks range from backing up the user's home folders every day at midnight, to logging CPU information every hour. - -The command `crontab` (cron table) is used to edit the list of scheduled tasks in operation, and is done on a per-user basis; each user (including `root`) has their own `crontab`. - -=== Editing the `crontab` File - -Run `crontab` with the `-e` flag to edit the cron table: - -[,bash] ----- -crontab -e ----- - -NOTE: The first time you run `crontab` you'll be prompted to select an editor; if you are not sure which one to use, choose `nano` by pressing `Enter`. - -=== Adding a Scheduled Task - -The layout for a cron entry is made up of six components: minute, hour, day of month, month of year, day of week, and the command to be executed. - ----- -# m h dom mon dow command ----- - ----- -# * * * * * command to execute -# ┬ ┬ ┬ ┬ ┬ -# │ │ │ │ │ -# │ │ │ │ │ -# │ │ │ │ └───── day of week (0 - 7) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0) -# │ │ │ └────────── month (1 - 12) -# │ │ └─────────────── day of month (1 - 31) -# │ └──────────────────── hour (0 - 23) -# └───────────────────────── min (0 - 59) ----- - -For example: - ----- -0 0 * * * /home/pi/backup.sh ----- - -This cron entry would run the `backup.sh` script every day at midnight. - -=== Viewing Scheduled Tasks - -View your currently saved scheduled tasks with: - -[,bash] ----- -crontab -l ----- - -=== Erase scheduled tasks - -Delete all currently scheduled tasks: - -[,bash] ----- -crontab -r ----- - -=== Running a Task on Reboot - -To run a command every time the Raspberry Pi starts up, write `@reboot` instead of the time and date. For example: - ----- -@reboot python /home/pi/myscript.py ----- - -This will run your Python script every time the Raspberry Pi reboots. If you want your command to be run in the background while the Raspberry Pi continues starting up, add a space and `&` at the end of the line, like this: - ----- -@reboot python /home/pi/myscript.py & ----- diff --git a/documentation/asciidoc/computers/using_linux/linux-multiple-users.adoc b/documentation/asciidoc/computers/using_linux/linux-multiple-users.adoc deleted file mode 100644 index 2776f29b2..000000000 --- a/documentation/asciidoc/computers/using_linux/linux-multiple-users.adoc +++ /dev/null @@ -1,40 +0,0 @@ -== Linux Users - -User management in Raspberry Pi OS is done on the command line. The default user is `pi`, and the password is `raspberry`. You can add users and change each user's password. - -=== Changing your Password - -Once you're logged in as the `pi` user, it is highly advisable to use the `passwd` command to change the default password to improve your Raspberry Pi's security. - -Enter `passwd` on the command line and press `Enter`. You'll be prompted to enter your current password to authenticate, and then asked for a new password. Press `Enter` on completion and you'll be asked to confirm it. Note that no characters will be displayed while entering your password. Once you've correctly confirmed your password, you'll be shown a success message (`passwd: password updated successfully`), and the new password will apply immediately. - -If your user has `sudo` permissions, you can change another user's password with `passwd` followed by the user's username. For example, `sudo passwd bob` will allow you to set the user ``bob``'s password, and then some additional optional values for the user such as their name. Just press `Enter` to skip each of these options. - -==== Remove a User's Password - -You can remove the password for the user `bob` with `sudo passwd bob -d`. Without a password the user will not be able to login to a Terminal. - -NOTE: This is useful for users that need to exist for system reasons, but you don't want it to be possible to login to the account for security reasons. - -=== Creating a New User - -You can create additional users on your Raspberry Pi OS installation with the `adduser` command. - -Enter `sudo adduser bob` and you'll be prompted for a password for the new user `bob`. Leave this blank if you don't want a password. - -==== Your Home Folder - -When you create a new user, they will have a home folder in `/home/`. The `pi` user's home folder is at `/home/pi/`. - -===== The `skel` Command - -Upon creating a new user, the contents of `/etc/skel/` will be copied to the new user's home folder. You can add or modify dot-files such as the `.bashrc` in `/etc/skel/` to your requirements, and this version will be applied to new users. - -=== Deleting a User - -You can delete a user on your system with the command `userdel`. Apply the `-r` flag to remove their home folder too: - -[,bash] ----- -sudo userdel -r bob ----- diff --git a/documentation/asciidoc/computers/using_linux/linux-root-user.adoc b/documentation/asciidoc/computers/using_linux/linux-root-user.adoc deleted file mode 100644 index f38246a08..000000000 --- a/documentation/asciidoc/computers/using_linux/linux-root-user.adoc +++ /dev/null @@ -1,38 +0,0 @@ -== Root and Sudo - -The Linux operating system is a multi-user operating system which allows multiple users to log in and use the computer. To protect the computer (and the privacy of other users), the users' abilities are restricted. - -Most users are allowed to run most programs, and to save and edit files stored in their own home folder. Normal users are not normally allowed to edit files in other users' folders or any of the system files. There's a special user in Linux known as the *superuser*, which is usually given the username `root`. The superuser has unrestricted access to the computer and can do almost anything. - -=== The `sudo` Command - -You won't normally log into the computer as `root`, but you can use the `sudo` command to provide access as the superuser. If you log into your Raspberry Pi as the `pi` user, then you're logging in as a normal user. You can run commands as the `root` user by using the `sudo` command before the program you want to run. - -For example, if you want to install additional software on Raspberry Pi OS then you normally use the `apt` tool. To update the list of available software, you need to prefix the `apt` command with sudo: - -`sudo apt update` - -You can also run a superuser shell by using `sudo su`. When running commands as a superuser there's nothing to protect against mistakes that could damage the system. It's recommended that you only run commands as the superuser when required, and to exit a superuser shell when it's no longer needed. - -=== The Sudo'ers List - -The default `pi` user on Raspberry Pi OS is a member of the `sudo` group. This gives the ability to run commands as root when preceded by `sudo`, and to switch to the root user with `sudo su`. - -To add a new user to the `sudo` group, use the `adduser` command: - -[,bash] ----- -sudo adduser bob sudo ----- - -Note that the user `bob` will be prompted to enter their password when they run `sudo`. This differs from the behaviour of the `pi` user, since `pi` is not prompted for their password. If you wish to remove the password prompt from the new user, create a custom sudoers file and place it in the `/etc/sudoers.d` directory. - -. Create the file using `sudo visudo /etc/sudoers.d/010_bob-nopasswd`. -. Insert the following contents on a single line: `bob ALL=(ALL) NOPASSWD: ALL` -. Save the file and exit. - -Once you have exited the editor, the file will be checked for any syntax errors. If no errors were detected, the file will be saved and you will be returned to the shell prompt. If errors were detected, you will be asked 'what now?' Press the 'enter' key on your keyboard: this will bring up a list of options. You will probably want to use 'e' for '(e)dit sudoers file again', so you can edit the file and fix the problem. - -NOTE: Choosing option 'Q' will save the file with any syntax errors still in place, which makes it impossible for _any_ user to use the sudo command. - -NOTE: It is standard practice on Linux to have the user prompted for their password when they run `sudo`, since it makes the system slightly more secure. diff --git a/documentation/asciidoc/computers/using_linux/linux-scripting.adoc b/documentation/asciidoc/computers/using_linux/linux-scripting.adoc deleted file mode 100644 index d3de0c608..000000000 --- a/documentation/asciidoc/computers/using_linux/linux-scripting.adoc +++ /dev/null @@ -1,21 +0,0 @@ -== Shell Scripts - -Commands can be combined together in a file which can then be executed. As an example, copy the following into your favourite text editor: - -[,bash] ----- -#!/usr/bin/bash - -while : -do -echo Raspberry Pi! -done ----- - -Save this with the name `fun-script`. - -Before you can run it you must first make it executable; this can be done by using the change mode command `chmod`. Each file and directory has its own set of permissions that dictate what a user can and can't do to it. In this case, by running the command `chmod +x fun-script`, the file `fun-script` will now be executable. - -You can then run it by typing `./fun-script` (assuming that it's in your current directory). - -This script infinitely loops and prints `Raspberry Pi!`; to stop it, press `Ctrl + C`. This kills any command that's currently being run in the terminal. diff --git a/documentation/asciidoc/computers/using_linux/linux-systemd.adoc b/documentation/asciidoc/computers/using_linux/linux-systemd.adoc deleted file mode 100644 index 6d4af674b..000000000 --- a/documentation/asciidoc/computers/using_linux/linux-systemd.adoc +++ /dev/null @@ -1,60 +0,0 @@ -== The `systemd` Daemon - -In order to have a command or program run when the Raspberry Pi boots, you can add it as a service. Once this is done, you can start/stop enable/disable from the linux prompt. - -=== Creating a Service - -On your Raspberry Pi, create a `.service` file for your service, for example: `myscript.service` - ----- -[Unit] -Description=My service -After=network.target - -[Service] -ExecStart=/usr/bin/python3 -u main.py -WorkingDirectory=/home/pi/myscript -StandardOutput=inherit -StandardError=inherit -Restart=always -User=pi - -[Install] -WantedBy=multi-user.target ----- - -So in this instance, the service would run Python 3 from our working directory `/home/pi/myscript` which contains our python program to run `main.py`. But you are not limited to Python programs: simply change the `ExecStart` line to be the command to start any program or script that you want running from booting. - -Copy this file into `/etc/systemd/system` as root, for example: - ----- -sudo cp myscript.service /etc/systemd/system/myscript.service ----- - -Once this has been copied, you have to inform `systemd` that a new service has been added. This is done with the following command: - ----- -sudo systemctl daemon-reload ----- - -Now you can attempt to start the service using the following command: - ----- -sudo systemctl start myscript.service ----- - -Stop it using following command: - ----- -sudo systemctl stop myscript.service ----- - -When you are happy that this starts and stops your app, you can have it start automatically on reboot by using this command: - ----- -sudo systemctl enable myscript.service ----- - -The `systemctl` command can also be used to restart the service or disable it from boot up. - -NOTE: The order in which things are started is based on their dependencies -- this particular script should start fairly late in the boot process, after a network is available (see the After section). You can configure different dependencies and orders based on your requirements. diff --git a/documentation/asciidoc/computers/using_linux/linux-using-commands.adoc b/documentation/asciidoc/computers/using_linux/linux-using-commands.adoc deleted file mode 100644 index d5ffb4083..000000000 --- a/documentation/asciidoc/computers/using_linux/linux-using-commands.adoc +++ /dev/null @@ -1,157 +0,0 @@ -== Linux Commands - -Here are some fundamental and common Linux commands with example usage: - -=== Filesystem - -==== ls - -The `ls` command lists the content of the current directory (or one that is specified). It can be used with the `-l` flag to display additional information (permissions, owner, group, size, date and timestamp of last edit) about each file and directory in a list format. The `-a` flag allows you to view files beginning with `.` (i.e. dotfiles). - -==== cd - -Using `cd` changes the current directory to the one specified. You can use relative (i.e. `cd directoryA`) or absolute (i.e. `cd /home/pi/directoryA`) paths. - -==== pwd - -The `pwd` command displays the name of the present working directory: on a Raspberry Pi, entering `pwd` will output something like `/home/pi`. - -==== mkdir - -You can use `mkdir` to create a new directory, e.g. `mkdir newDir` would create the directory `newDir` in the present working directory. - -==== rmdir - -To remove empty directories, use `rmdir`. So, for example, `rmdir oldDir` will remove the directory `oldDir` only if it is empty. - -==== rm - -The command `rm` removes the specified file (or recursively from a directory when used with `-r`). Be careful with this command: files deleted in this way are mostly gone for good! - -==== cp - -Using `cp` makes a copy of a file and places it at the specified location (this is similar to copying and pasting). For example, `cp ~/fileA /home/otherUser/` would copy the file `fileA` from your home directory to that of the user `otherUser` (assuming you have permission to copy it there). This command can either take `FILE FILE` (`cp fileA fileB`), `FILE DIR` (`cp fileA /directoryB/`) or `-r DIR DIR` (which recursively copies the contents of directories) as arguments. - -==== mv - -The `mv` command moves a file and places it at the specified location (so where `cp` performs a 'copy-paste', `mv` performs a 'cut-paste'). The usage is similar to `cp`. So `mv ~/fileA /home/otherUser/` would move the file `fileA` from your home directory to that of the user otherUser. This command can either take `FILE FILE` (`mv fileA fileB`), `FILE DIR` (`mv fileA /directoryB/`) or `DIR DIR` (`mv /directoryB /directoryC`) as arguments. This command is also useful as a method to rename files and directories after they've been created. - -==== touch - -The command `touch` sets the last modified time-stamp of the specified file(s) or creates it if it does not already exist. - -==== cat - -You can use `cat` to list the contents of file(s), e.g. `cat thisFile` will display the contents of `thisFile`. Can be used to list the contents of multiple files, i.e. `cat *.txt` will list the contents of all `.txt` files in the current directory. - -==== head - -The `head` command displays the beginning of a file. Can be used with `-n` to specify the number of lines to show (by default ten), or with `-c` to specify the number of bytes. - -==== tail - -The opposite of `head`, `tail` displays the end of a file. The starting point in the file can be specified either through `-b` for 512 byte blocks, `-c` for bytes, or `-n` for number of lines. - -==== chmod - -You would normally use `chmod` to change the permissions for a file. The `chmod` command can use symbols `u` (user that owns the file), `g` (the files group) , and `o` (other users) and the permissions `r` (read), `w` (write), and `x` (execute). Using `chmod u+x *filename*` will add execute permission for the owner of the file. - -==== chown - -The `chown` command changes the user and/or group that owns a file. It normally needs to be run as root using sudo e.g. `sudo chown pi:root *filename*` will change the owner to pi and the group to root. - -==== ssh - -`ssh` denotes the secure shell. Connect to another computer using an encrypted network connection. -For more details see xref:remote-access.adoc#ssh[SSH (secure shell)] - -==== scp - -The `scp` command copies a file from one computer to another using `ssh`. -For more details see xref:remote-access.adoc#using-secure-copy[SCP (secure copy)] - -==== sudo - -The `sudo` command enables you to run a command as a superuser, or another user. Use `sudo -s` for a superuser shell. -For more details see xref:using_linux.adoc#root-and-sudo[Root user / sudo] - -==== dd - -The `dd` command copies a file converting the file as specified. It is often used to copy an entire disk to a single file or back again. So, for example, `dd if=/dev/sdd of=backup.img` will create a backup image from an SD card or USB disk drive at /dev/sdd. Make sure to use the correct drive when copying an image to the SD card as it can overwrite the entire disk. - -==== df - -Use `df` to display the disk space available and used on the mounted filesystems. Use `df -h` to see the output in a human-readable format using M for MBs rather than showing number of bytes. - -==== unzip - -The `unzip` command extracts the files from a compressed zip file. - -==== tar - -Use `tar` to store or extract files from a tape archive file. It can also reduce the space required by compressing the file similar to a zip file. - -To create a compressed file, use `tar -cvzf *filename.tar.gz* *directory/*` -To extract the contents of a file, use `tar -xvzf *filename.tar.gz*` - -==== pipes - -A pipe allows the output from one command to be used as the input for another command. The pipe symbol is a vertical line `|`. For example, to only show the first ten entries of the `ls` command it can be piped through the head command `ls | head` - -==== tree - -Use the `tree` command to show a directory and all subdirectories and files indented as a tree structure. - -==== & - -Run a command in the background with `&`, freeing up the shell for future commands. - -==== wget - -Download a file from the web directly to the computer with `wget`. So `+wget https://datasheets.raspberrypi.com/rpi4/raspberry-pi-4-datasheet.pdf+` will download the Raspberry Pi 4 datasheet and save it as `raspberry-pi-4-datasheet.pdf`. - -==== curl - -Use `curl` to download or upload a file to/from a server. By default, it will output the file contents of the file to the screen. - -==== man - -Show the manual page for a file with `man`. To find out more, run `man man` to view the manual page of the man command. - -=== Search - -==== grep - -Use `grep` to search inside files for certain search patterns. For example, `grep "search" *.txt` will look in all the files in the current directory ending with .txt for the string search. - -The `grep` command supports regular expressions which allows special letter combinations to be included in the search. - -==== awk - -`awk` is a programming language useful for searching and manipulating text files. - -==== find - -The `find` command searches a directory and subdirectories for files matching certain patterns. - -==== whereis - -Use `whereis` to find the location of a command. It looks through standard program locations until it finds the requested command. - -=== Networking - -==== ping - -The `ping` utility is usually used to check if communication can be made with another host. It can be used with default settings by just specifying a hostname (e.g. `ping raspberrypi.com`) or an IP address (e.g. `ping 8.8.8.8`). It can specify the number of packets to send with the `-c` flag. - -==== nmap - -`nmap` is a network exploration and scanning tool. It can return port and OS information about a host or a range of hosts. Running just `nmap` will display the options available as well as example usage. - -==== hostname - -The `hostname` command displays the current hostname of the system. A privileged (super) user can set the hostname to a new one by supplying it as an argument (e.g. `hostname new-host`). - -==== ifconfig - -Use `ifconfig` to display the network configuration details for the interfaces on the current system when run without any arguments (i.e. `ifconfig`). By supplying the command with the name of an interface (e.g. `eth0` or `lo`) you can then alter the configuration: check the manual page for more details. diff --git a/documentation/asciidoc/computers/using_linux/linux-using-text-editors.adoc b/documentation/asciidoc/computers/using_linux/linux-using-text-editors.adoc deleted file mode 100644 index 75eab92d0..000000000 --- a/documentation/asciidoc/computers/using_linux/linux-using-text-editors.adoc +++ /dev/null @@ -1,57 +0,0 @@ -== Text Editors - -On Linux, you have a choice of text editors. Some are easy-to-use but have limited functionality; others require training to use and take a long time to master, but offer incredible functionality. - -=== Text Editors on Desktop - -==== Text Editor - -When using Raspberry Pi OS with desktop, in the accessories menu there is an option to run a Text Editor. This is a simple editor which opens in a window like a normal application. It allows use of the mouse and keyboard, and has tabs and syntax highlighting. - -You can use keyboard shortcuts, such as `Ctrl + S` to save a file and `Ctrl + X` to exit. - -==== Thonny - -https://thonny.org/[Thonny] is a Python REPL and IDE, so you can write and edit Python code in a window and run it directly from the editor. Thonny has independent windows, and syntax highlighting, and uses Python 3. - -==== Geany - -A fast and lightweight IDE, supporting many different file types, including C/{cpp} and Python. It is installed by default on Raspberry Pi OS. - -=== Text Editors in the Terminal - -==== Nano - -GNU Nano is at the easy-to-use end of command-line editors. It's installed by default, so use `nano somefile.txt` to edit a file, and keyboard shortcuts like `Ctrl + O` to save and `Ctrl + X` to exit. - -==== Vi - -Vi is a very old (c. 1976) command-line editor, which is available on most UNIX systems and is pre-installed on Raspberry Pi OS. It's succeeded by Vim (Vi Improved), which requires installation. - -Unlike most editors, Vi and Vim have a number of different modes. When you open Vi with `vi somefile.txt`, you start in command mode which doesn't directly permit text entry. Press `i` to switch to insert mode in order to edit the file, and type away. To save the file you must return to command mode, so press the `Escape` key and enter `:w` (followed by `Enter`), which is the command to write the file to disk. - -To search for the word 'raspberry' in a file, make sure you're in command mode (press `Escape`), then type `/raspberry` followed by `n` and `N` to flick forwards/backwards through the results. - -To save and exit, enter the command `:wq`. To exit without saving, enter the command `:q!`. - -Depending on your keyboard configuration, you may find your cursor keys don't work. In this case, you can use the H-J-K-L keys (which move left, down, up, and right respectively) to navigate the file in command mode. - -==== Vim - -Vim is an extension of Vi and works in much the same way, with a number of improvements. Only Vi is installed by default so to get the full features of Vim, install it with APT: - ----- -sudo apt install vim ----- - -You can edit a file in Vim with `vim somefile.txt`. - -==== Emacs - -Emacs is a GNU command-line text editor; it's powerful, extensible, and customisable. You can install it with APT: - ----- -sudo apt install emacs ----- - -You can use keyboard combination commands, such as `Ctrl + X Ctrl + S` to save and `Ctrl + X Ctrl + C` to close. diff --git a/documentation/asciidoc/computers/using_linux/using-the-terminal.adoc b/documentation/asciidoc/computers/using_linux/using-the-terminal.adoc deleted file mode 100644 index eba6b57fc..000000000 --- a/documentation/asciidoc/computers/using_linux/using-the-terminal.adoc +++ /dev/null @@ -1,64 +0,0 @@ -== Terminal - -The terminal (or 'command-line') on a computer allows a user a great deal of control over their system. Users of Windows may already have come across `Command Prompt` or `Powershell`, while mac OS users may be familiar with `Terminal`. All of these tools allow a user to directly manipulate their system through the use of commands. These commands can be chained together and/or combined together into complex xref:using_linux.adoc#shell-scripts[scripts] that can potentially complete tasks more efficiently than much larger traditional software packages. - -=== Opening a Terminal window - -On the Raspberry Pi OS, the default terminal application is called `LXTerminal`. This is known as a 'terminal emulator', this means that it emulates the old style video terminals — from before Windowing systems were developed — inside a graphical environment. The application can be found on the Raspberry Pi desktop, and when started will look something like this: - -image::images/terminal.png[Terminal screenshot] - -In the terminal window you should be able to see the following prompt: - -[source,bash] ----- -pi@raspberrypi ~ $ ----- - -This shows your username and the hostname of the Raspberry Pi. Here the username is `pi` and the hostname is `raspberrypi`. - -=== Navigating and browsing your Raspberry Pi - -One of the key aspects of using a terminal is being able to navigate your file system. Go ahead and type `ls -la` into the Terminal window, and then hit the RETURN key. You should see something similar to: - -image::images/lsresult.png[ls result] - -The `ls` command lists the contents of the directory that you are currently in (your present working directory). The `-la` component of the command is what's known as a 'flag'. Flags modify the command that's being run. In this case the `l` displays the contents of the directory in a list, showing data such as their sizes and when they were last edited, and the `a` displays all files, including those beginning with a `.`, known as 'dotfiles'. Dotfiles usually act as configuration files for software and as they are written in text, they can be modified by simply editing them. - -In order to navigate to other directories the change directory command, `cd`, can be used. You can specify the directory that you want to go to by either the 'absolute' or the 'relative' path. So if you wanted to navigate to the `python_games` directory, you could either do `cd /home/pi/python_games` or just `cd python_games` (if you are currently in `/home/pi`). There are some special cases that may be useful: `~` acts as an alias for your home directory, so `~/python_games` is the same as `/home/pi/python_games`; `.` and `..` are aliases for the current directory and the parent directory respectively, e.g. if you were in `/home/pi/python_games`, `cd ..` would take you to `/home/pi`. - -=== History and auto-complete - -Rather than type every command, the terminal allows you to scroll through previous commands that you've run by pressing the `up` or `down` keys on your keyboard. If you are writing the name of a file or directory as part of a command then pressing `tab` will attempt to auto-complete the name of what you are typing. For example, if you have a file in a directory called `aLongFileName` then pressing tab after typing `a` will allow you to choose from all file and directory names beginning with `a` in the current directory, allowing you to choose `aLongFileName`. - -=== The `sudo` command - -Some commands that make permanent changes to the state of your system require you to have root privileges to run. The command `sudo` temporarily gives your account (if you're not already logged in as root) the ability to run these commands, provided your user name is in a list of users ('sudoers'). When you append `sudo` to the start of a command and press `enter`, the command following `sudo` will be run using root privileges. Be very careful: commands requiring root privileges can irreparably damage your system! Note that on some systems you will be prompted to enter your password when you run a command with `sudo`. - -Further information on `sudo` and the root user can be found on the xref:using_linux.adoc#root-and-sudo[linux root page]. - -=== Installing software using `apt` - -You can use the xref:os.adoc#using-apt[`apt`] command to install software in Raspberry Pi OS. This is the 'package manager' that is included with any Debian-based Linux distributions, including Raspberry Pi OS. It allows you to install and manage new software packages on your Raspberry Pi. - -In order to install a new package, you would type `sudo apt install `, where `` is the package that you want to install. - -Running `sudo apt update` will update a list of software packages that are available on your system. If a new version of a package is available, then `sudo apt full-upgrade` will update any old packages to the new version. - -Finally, `sudo apt remove ` removes or uninstalls a package from your system. - -=== Other useful commands - -There are a few other commands that you may find useful, these are listed below: - -* `cp` makes a copy of a file and places it at the specified location (essentially doing a 'copy-paste'), for example - `cp file_a /home/other_user/` would copy the file `file_a` from your home directory to that of the user `other_user` (assuming you have permission to copy it there). Note that if the target is a folder, the filename will remain the same, but if the target is a filename, it will give the file the new name. -* `mv` moves a file and places it at the specified location (so where `cp` performs a 'copy-paste', `mv` performs a 'cut-paste'). The usage is similar to `cp`, so `mv file_a /home/other_user/` would move the file `file_a` from your home directory to that of the specified user. `mv` is also used to rename a file, i.e. move it to a new location, e.g. `mv hello.txt story.txt`. -* `rm` removes the specified file (or directory when used with `-r`). *Warning:* Files deleted in this way are generally not restorable. -* `mkdir`: This makes a new directory, e.g. `mkdir new_dir` would create the directory `new_dir` in the present working directory. -* `cat` lists the contents of files, e.g. `cat some_file` will display the contents of `some_file`. - -Other commands you may find useful can be found in the xref:using_linux.adoc#linux-commands[commands page]. - -=== Finding out about a command - -To find out more information about a particular command then you can run the `man` followed by the command you want to know more about (e.g. `man ls`). The man-page (or manual page) for that command will be displayed, including information about the flags for that program and what effect they have. Some man-pages will give example usage. diff --git a/documentation/index.json b/documentation/index.json index db23f073c..12c1c6bd7 100644 --- a/documentation/index.json +++ b/documentation/index.json @@ -35,12 +35,6 @@ "image": "full-sized/Linux-Kernel.png", "subpath": "linux_kernel.adoc" }, - { - "title": "Using Linux", - "description": "How to use the Linux command line from Raspberry Pi OS", - "image": "full-sized/Using-Linux.png", - "subpath": "using_linux.adoc" - }, { "title": "Remote Access", "description": "Accessing your Raspberry Pi remotely", From 2f8768f23708db7f94ed59b1459e7f1ea1a799db Mon Sep 17 00:00:00 2001 From: Alasdair Allan Date: Mon, 25 Apr 2022 07:35:23 +0100 Subject: [PATCH 11/27] Update raspi-config.adoc --- .../asciidoc/computers/configuration/raspi-config.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/computers/configuration/raspi-config.adoc b/documentation/asciidoc/computers/configuration/raspi-config.adoc index 50213d150..5c22f4f81 100644 --- a/documentation/asciidoc/computers/configuration/raspi-config.adoc +++ b/documentation/asciidoc/computers/configuration/raspi-config.adoc @@ -45,7 +45,7 @@ Specify the audio output destination. You can change the 'default' user password. -NOTE: Until recently the default user on Raspberry Pi OS is `pi` with the password `raspberry`. The default user is now set on first boot using a configuration wizard. +NOTE: Until recently the default user on Raspberry Pi OS was `pi` with the password `raspberry`. The default user is now set on first boot using a configuration wizard. [[hostname]] ===== Hostname From b864ae2e9867a374dc363a348747969e4b3c1fc1 Mon Sep 17 00:00:00 2001 From: Andrew Scheller Date: Mon, 25 Apr 2022 13:48:58 +0100 Subject: [PATCH 12/27] typo --- .../computers/getting-started/installing-from-an-image.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc b/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc index 3f5daac59..548ee204f 100644 --- a/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc +++ b/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc @@ -1,6 +1,6 @@ == Installing the Operating System -Raspberry Pi recommend the use of https://www.raspberrypi.com/software/[Raspberry Pi Imager] to install an operating system on your SD card. You will need another computer with an SD card reader to install the image. Rapsberry Pi Imager can be run on another Raspberry Pi, but also works on Microsoft Windows, Apple macOS, and Linux. +Raspberry Pi recommend the use of https://www.raspberrypi.com/software/[Raspberry Pi Imager] to install an operating system on your SD card. You will need another computer with an SD card reader to install the image. Raspberry Pi Imager can be run on another Raspberry Pi, but also works on Microsoft Windows, Apple macOS, and Linux. NOTE: Before you start, don't forget to check the xref:getting-started.adoc#sd-cards[SD card requirements]. From d23d08bf352e4158907a22a135a204fdeeb518a3 Mon Sep 17 00:00:00 2001 From: Alasdair Allan Date: Fri, 29 Apr 2022 10:29:22 +0100 Subject: [PATCH 13/27] Update cm-emmc-flashing.adoc --- .../asciidoc/computers/compute-module/cm-emmc-flashing.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/computers/compute-module/cm-emmc-flashing.adoc b/documentation/asciidoc/computers/compute-module/cm-emmc-flashing.adoc index 7608df8d7..874b3c0ad 100644 --- a/documentation/asciidoc/computers/compute-module/cm-emmc-flashing.adoc +++ b/documentation/asciidoc/computers/compute-module/cm-emmc-flashing.adoc @@ -101,7 +101,7 @@ For more information run ==== Writing to the eMMC (Windows) -After `rpiboot` completes, a new USB mass storage drive will appear in Windows. We recommend using https://www.raspberrypi.com/software/[Raspberry Pi Imager] to write images to the drive, rather than trying to use `/dev/sda` etc. from Cygwin. +After `rpiboot` completes, a new USB mass storage drive will appear in Windows. We recommend using https://www.raspberrypi.com/software/[Raspberry Pi Imager] to write images to the drive. Make sure J4 (USB SLAVE BOOT ENABLE) / J2 (nRPI_BOOT) is set to the disabled position and/or nothing is plugged into the USB slave port. Power cycling the IO board should now result in the Compute Module booting from eMMC. From 7b30c724bdc9f36db1fb061e422ba2e2f44ef86b Mon Sep 17 00:00:00 2001 From: Alasdair Allan Date: Fri, 29 Apr 2022 10:30:48 +0100 Subject: [PATCH 14/27] Update installing-from-an-image.adoc --- .../computers/getting-started/installing-from-an-image.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc b/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc index 548ee204f..c9390a41d 100644 --- a/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc +++ b/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc @@ -1,6 +1,6 @@ == Installing the Operating System -Raspberry Pi recommend the use of https://www.raspberrypi.com/software/[Raspberry Pi Imager] to install an operating system on your SD card. You will need another computer with an SD card reader to install the image. Raspberry Pi Imager can be run on another Raspberry Pi, but also works on Microsoft Windows, Apple macOS, and Linux. +Raspberry Pi recommend the use of https://www.raspberrypi.com/software/[Raspberry Pi Imager] to install an operating system on to your SD card. You will need another computer with an SD card reader to install the image. Raspberry Pi Imager can be run on another Raspberry Pi, but also works on Microsoft Windows, Apple macOS, and Linux. NOTE: Before you start, don't forget to check the xref:getting-started.adoc#sd-cards[SD card requirements]. From 4f40b7f0b63ae2131ccbe99c671d82920adba9b9 Mon Sep 17 00:00:00 2001 From: Andrew Scheller Date: Tue, 3 May 2022 16:46:06 +0100 Subject: [PATCH 15/27] Small edits to BCM2835 page --- documentation/asciidoc/computers/processors/bcm2835.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/asciidoc/computers/processors/bcm2835.adoc b/documentation/asciidoc/computers/processors/bcm2835.adoc index 4ce77b54b..284f8fbd9 100644 --- a/documentation/asciidoc/computers/processors/bcm2835.adoc +++ b/documentation/asciidoc/computers/processors/bcm2835.adoc @@ -1,8 +1,8 @@ == BCM2835 -The BCM2835 is the Broadcom chip used in the Raspberry Pi 1 Models A, A+, B, B+, the Raspberry Pi Zero, the Raspberry Pi Zero W, and the Raspberry Pi Compute Module 1. Some details of the chip can be found in the https://datasheets.raspberrypi.com/bcm2835/bcm2835-peripherals.pdf[Peripheral specification] document. It contains a single core ARM1176JZF-S processor. +The BCM2835 is the Broadcom chip used in the Raspberry Pi 1 Models A, A+, B, B+, the Raspberry Pi Zero, the Raspberry Pi Zero W, and the Raspberry Pi Compute Module 1. Some details of the chip can be found in the https://datasheets.raspberrypi.com/bcm2835/bcm2835-peripherals.pdf[peripheral specification] document. It contains a single-core ARM1176JZF-S processor. -NOTE: This document contains a number of errors. However there is a list of currently known https://elinux.org/BCM2835_datasheet_errata[errata]. +NOTE: The peripheral specification document contains a number of errors. However there is a list of currently known https://elinux.org/BCM2835_datasheet_errata[errata]. Other information regarding the processor can be found in the following documents; From 80cbe56d92302f8615799e1af0b5bb927904324e Mon Sep 17 00:00:00 2001 From: Andrew Scheller Date: Wed, 4 May 2022 17:47:38 +0100 Subject: [PATCH 16/27] Fixup kB and MB to be consistent with the style-guide --- documentation/asciidoc/accessories/camera/raspicam.adoc | 6 +++--- documentation/asciidoc/computers/processors/bcm2711.adoc | 2 +- documentation/asciidoc/computers/processors/rp3a0.adoc | 2 +- .../computers/raspberry-pi/usb-bus-on-raspberry-pi.adoc | 2 +- .../microcontrollers/raspberry-pi-pico/about_pico.adoc | 2 +- .../microcontrollers/rp2040/rp2040_based_boards.adoc | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/documentation/asciidoc/accessories/camera/raspicam.adoc b/documentation/asciidoc/accessories/camera/raspicam.adoc index aa4fa1355..2362b1f1b 100644 --- a/documentation/asciidoc/accessories/camera/raspicam.adoc +++ b/documentation/asciidoc/accessories/camera/raspicam.adoc @@ -171,7 +171,7 @@ Capture your raw video with raspivid and wrap it in an MP4 container like this: [,bash] ---- -# Capture 30 seconds of raw video at 640x480 and 150kB/s bit rate into a pivideo.h264 file: +# Capture 30 seconds of raw video at 640x480 and 150kBps bit rate into a pivideo.h264 file: raspivid -t 30000 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o pivideo.h264 # Wrap the raw video with an MP4 container: MP4Box -add pivideo.h264 pivideo.mp4 @@ -945,7 +945,7 @@ Height of resulting video. This should be between 64 and 1080. --bitrate, -b Set bitrate ---- -Use bits per second, so 10Mbits/s would be `-b 10000000`. For H264, 1080p30 a high quality bitrate would be 15Mbits/s or more. Maximum bitrate is 25Mbits/s (`-b 25000000`), but much over 17Mbits/s won't show noticeable improvement at 1080p30. +Use bits per second, so 10Mbps would be `-b 10000000`. For H264, 1080p30 a high quality bitrate would be 15Mbps or more. Maximum bitrate is 25Mbps (`-b 25000000`), but much over 17Mbps won't show noticeable improvement at 1080p30. ---- --output, -o Output filename @@ -1308,7 +1308,7 @@ Record a 5s clip with default settings (1080p30): raspivid -t 5000 -o video.h264 ---- -Record a 5s clip at a specified bitrate (3.5Mbits/s): +Record a 5s clip at a specified bitrate (3.5Mbps): [,bash] ---- diff --git a/documentation/asciidoc/computers/processors/bcm2711.adoc b/documentation/asciidoc/computers/processors/bcm2711.adoc index 80cc3bcf2..17fc0a0bf 100644 --- a/documentation/asciidoc/computers/processors/bcm2711.adoc +++ b/documentation/asciidoc/computers/processors/bcm2711.adoc @@ -10,7 +10,7 @@ The BCM2711 chip continues to use the heat spreading technology started with the *Memory:* Accesses up to 8GB LPDDR4-2400 SDRAM (depending on model) -*Caches:* 32 KB data + 48 KB instruction L1 cache per core. 1MB L2 cache. +*Caches:* 32kB data + 48kB instruction L1 cache per core. 1MB L2 cache. *Multimedia:* H.265 (4Kp60 decode); H.264 (1080p60 decode, 1080p30 encode); OpenGL ES, 3.0 graphics diff --git a/documentation/asciidoc/computers/processors/rp3a0.adoc b/documentation/asciidoc/computers/processors/rp3a0.adoc index d78c95ca7..4ec33136a 100644 --- a/documentation/asciidoc/computers/processors/rp3a0.adoc +++ b/documentation/asciidoc/computers/processors/rp3a0.adoc @@ -1,6 +1,6 @@ == RP3A0 -The Raspberry Pi RP3A0 is our first System-in-Package (SiP) consisting of a Broadcom BCM2710A1 — which is the silicon die packaged inside the Broadcom xref:processors.adoc#bcm2837[BCM2837] chip which is used on the xref:raspberry-pi.adoc#raspberry-pi-3-model-b-2[Raspberry Pi 3] — along with 512 MB of DRAM. +The Raspberry Pi RP3A0 is our first System-in-Package (SiP) consisting of a Broadcom BCM2710A1 — which is the silicon die packaged inside the Broadcom xref:processors.adoc#bcm2837[BCM2837] chip which is used on the xref:raspberry-pi.adoc#raspberry-pi-3-model-b-2[Raspberry Pi 3] — along with 512MB of DRAM. It is used by the xref:raspberry-pi.adoc#raspberry-pi-zero-2-w[Raspberry Pi Zero 2 W]. diff --git a/documentation/asciidoc/computers/raspberry-pi/usb-bus-on-raspberry-pi.adoc b/documentation/asciidoc/computers/raspberry-pi/usb-bus-on-raspberry-pi.adoc index 755fd5eac..830bf303c 100644 --- a/documentation/asciidoc/computers/raspberry-pi/usb-bus-on-raspberry-pi.adoc +++ b/documentation/asciidoc/computers/raspberry-pi/usb-bus-on-raspberry-pi.adoc @@ -26,7 +26,7 @@ On the Raspberry Pi 4, the USB controller used on previous models is located on === Raspberry Pi Zero, 1, 2 and 3 -The USB controller on models prior to Raspberry Pi 4 has only a basic level of support for certain devices, which presents a higher software processing overhead. It also supports only one root USB port: all traffic from connected devices is funnelled down this single bus, which operates at a maximum speed of 480mbps. +The USB controller on models prior to Raspberry Pi 4 has only a basic level of support for certain devices, which presents a higher software processing overhead. It also supports only one root USB port: all traffic from connected devices is funnelled down this single bus, which operates at a maximum speed of 480Mbps. The USB 2.0 specification defines three device speeds - low, full and high. Most mice and keyboards are low speed, most USB sound devices are full speed and most video devices (webcams or video capture) are high speed. diff --git a/documentation/asciidoc/microcontrollers/raspberry-pi-pico/about_pico.adoc b/documentation/asciidoc/microcontrollers/raspberry-pi-pico/about_pico.adoc index f59f73963..20cea0fca 100644 --- a/documentation/asciidoc/microcontrollers/raspberry-pi-pico/about_pico.adoc +++ b/documentation/asciidoc/microcontrollers/raspberry-pi-pico/about_pico.adoc @@ -4,7 +4,7 @@ Raspberry Pi Pico is a low-cost, high-performance microcontroller board with fle * xref:rp2040.adoc#welcome-to-rp2040[RP2040] microcontroller chip designed by Raspberry Pi in the United Kingdom * Dual-core Arm Cortex M0+ processor, flexible clock running up to 133 MHz -* 264KB of SRAM, and 2MB of on-board Flash memory +* 264kB of SRAM, and 2MB of on-board Flash memory * Castellated module allows soldering direct to carrier boards * USB 1.1 with device and host support * Low-power sleep and dormant modes diff --git a/documentation/asciidoc/microcontrollers/rp2040/rp2040_based_boards.adoc b/documentation/asciidoc/microcontrollers/rp2040/rp2040_based_boards.adoc index 68b946fe0..e6553f3b7 100644 --- a/documentation/asciidoc/microcontrollers/rp2040/rp2040_based_boards.adoc +++ b/documentation/asciidoc/microcontrollers/rp2040/rp2040_based_boards.adoc @@ -6,7 +6,7 @@ An incomplete list of boards using RP2040. image::images/pico.jpg[] -https://www.raspberrypi.com/products/raspberry-pi-pico/[Raspberry Pi Pico]:: Designed by Raspberry Pi, RP2040 features a dual-core Arm Cortex-M0+ processor with 264KB internal RAM and support for up to 16MB of off-chip Flash. A wide range of flexible I/O options includes I2C, SPI, and — uniquely — Programmable I/O (PIO). These support endless possible applications for this small and affordable package. +https://www.raspberrypi.com/products/raspberry-pi-pico/[Raspberry Pi Pico]:: Designed by Raspberry Pi, RP2040 features a dual-core Arm Cortex-M0+ processor with 264kB internal RAM and support for up to 16MB of off-chip Flash. A wide range of flexible I/O options includes I2C, SPI, and — uniquely — Programmable I/O (PIO). These support endless possible applications for this small and affordable package. === Boards from Adafruit From 9f58e6ee8d9eb4ae68197e1b86e13db3f5fe0b23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 May 2022 23:07:45 +0000 Subject: [PATCH 17/27] Bump nokogiri from 1.13.4 to 1.13.6 Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.13.4 to 1.13.6. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/v1.13.6/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.13.4...v1.13.6) --- updated-dependencies: - dependency-name: nokogiri dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 5ece2acf4..2d6d329ca 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -55,7 +55,7 @@ GEM jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) - nokogiri (1.13.4) + nokogiri (1.13.6) mini_portile2 (~> 2.8.0) racc (~> 1.4) pathutil (0.16.2) From a354b68a7ad4cb13a5074b414941c510318a5dfc Mon Sep 17 00:00:00 2001 From: Andrew Scheller Date: Tue, 10 May 2022 16:40:48 +0100 Subject: [PATCH 18/27] Minor copy-edit --- .../asciidoc/computers/compute-module/cm-peri-sw-guide.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/computers/compute-module/cm-peri-sw-guide.adoc b/documentation/asciidoc/computers/compute-module/cm-peri-sw-guide.adoc index e2a62ec6c..6cd5b3d5b 100644 --- a/documentation/asciidoc/computers/compute-module/cm-peri-sw-guide.adoc +++ b/documentation/asciidoc/computers/compute-module/cm-peri-sw-guide.adoc @@ -95,7 +95,7 @@ During boot, the user can specify a specific ARM device tree to use via the `dev In addition to loading an ARM dtb, `start.elf` supports loading additional Device Tree 'overlays' via the `dtoverlay` parameter in `config.txt`, for example adding as many `dtoverlay=myoverlay` lines as required as overlays to `config.txt`, noting that overlays live in `/overlays` and are suffixed `-overlay.dtb` e.g. `/overlays/myoverlay-overlay.dtb`. Overlays are merged with the base dtb file before the data is passed to the Linux kernel when it starts. -Overlays are used to add data to the base dtb that (nominally) describes non board-specific hardware. This includes GPIO pins used and their function, as well as the device(s) attached, so that the correct drivers can be loaded. The convention is that on a Raspberry Pi, all hardware attached to the Bank0 GPIOs (the GPIO header) should be described using an overlay. On a Compute Module all hardware attached to the Bank0 and Bank1 GPIOs should be described in an overlay file. You don't have to follow these conventions: you can roll all the information into one single dtb file, as previously described, replacing `bcm2708-rpi-cm.dtb`. However, following the conventions means that you can use a 'standard' Raspberry Pi OS release, with its standard base dtb and all the product-specific information contained in a separate overlay. Occasionally the base dtb might change - usually in a way that will not break overlays - which is why using an overlay is suggested. +Overlays are used to add data to the base dtb that (nominally) describes non-board-specific hardware. This includes GPIO pins used and their function, as well as the device(s) attached, so that the correct drivers can be loaded. The convention is that on a Raspberry Pi, all hardware attached to the Bank0 GPIOs (the GPIO header) should be described using an overlay. On a Compute Module all hardware attached to the Bank0 and Bank1 GPIOs should be described in an overlay file. You don't have to follow these conventions: you can roll all the information into one single dtb file, as previously described, replacing `bcm2708-rpi-cm.dtb`. However, following the conventions means that you can use a 'standard' Raspberry Pi OS release, with its standard base dtb and all the product-specific information contained in a separate overlay. Occasionally the base dtb might change - usually in a way that will not break overlays - which is why using an overlay is suggested. === dt-blob.bin From f9e518710f4f0fa42435d455a7ad258af22a6800 Mon Sep 17 00:00:00 2001 From: Andrew Scheller Date: Wed, 11 May 2022 13:14:32 +0100 Subject: [PATCH 19/27] Remove redundant link --- .../computers/getting-started/installing-from-an-image.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc b/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc index c9390a41d..753b6d1e2 100644 --- a/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc +++ b/documentation/asciidoc/computers/getting-started/installing-from-an-image.adoc @@ -45,7 +45,7 @@ If you are installing Raspberry Pi OS Lite and intend to run it xref:configurati === Downloading an Image -If you are using a different tool than Raspberry Pi Imager to write to your SD Card, most require you to download the image first, then use the tool to write it to the card. Official images for recommended operating systems are available to download from the Raspberry Pi website https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-32-bit[downloads page]. Alternative operating systems for Raspberry Pi computers are https://www.raspberrypi.com/software/operating-systems/#third-party-software[also available] from some third-party vendors. +If you are using a different tool than Raspberry Pi Imager to write to your SD Card, most require you to download the image first, then use the tool to write it to the card. Official images for recommended operating systems are available to download from the Raspberry Pi website https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-32-bit[downloads page]. Alternative operating systems for Raspberry Pi computers are also available from some third-party vendors. You may need to unzip the downloaded file (`.zip`) to get the image file (`.img`) you need to write to the card. From dd710fd69178cf9259ff3709dcd66f736500413c Mon Sep 17 00:00:00 2001 From: Tim Gover Date: Wed, 11 May 2022 14:17:07 +0100 Subject: [PATCH 20/27] Minor bootloader updates + document the PARTITION property Update the bootloader documentation now that network install is included in the default release. --- .../raspberry-pi/bcm2711-bootloader.adoc | 15 +++++++++++++++ .../computers/raspberry-pi/bootflow-2711.adoc | 3 +++ 2 files changed, 18 insertions(+) diff --git a/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc b/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc index 4d307b832..47945ca39 100644 --- a/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc +++ b/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc @@ -337,6 +337,8 @@ To enable network install, add `NET_INSTALL_ENABLED=1`, or to disable network in This setting is ignored and network install is disabled if `DISABLE_HDMI=1` is set. +In order to detect the keyboard network install must initialise the USB controller and enumerate devices. This increases boot time by approximately 1 second so it may be advantageous to disable network install in some embedded applications. + Default: `1` on Raspberry Pi 4 and Raspberry Pi 400, and `0` on Compute Module 4. [[NET_INSTALL_KEYBOARD_WAIT]] @@ -387,6 +389,19 @@ NETCONSOLE=6665@169.254.1.1/,6666@/ Default: "" (not enabled) + Max length: 32 characters +[[PARTITION]] +==== PARTITION + +The `PARTITION` option may be used to specify the boot partition number if it has not explicitly been set by the `reboot` command (e.g. `sudo reboot N`) or by `boot_partition=N` in `autoboot.txt`. +This could be used to boot from a rescue partition if the user presses a button. +---- +# Boot from partition 2 if GPIO 7 is pulled low +[gpio7=0] +PARTITION=2 +---- + +Default: 0 + [[USB_MSD_EXCLUDE_VID_PID]] ==== USB_MSD_EXCLUDE_VID_PID diff --git a/documentation/asciidoc/computers/raspberry-pi/bootflow-2711.adoc b/documentation/asciidoc/computers/raspberry-pi/bootflow-2711.adoc index f4a15f3b4..263b9aa2e 100644 --- a/documentation/asciidoc/computers/raspberry-pi/bootflow-2711.adoc +++ b/documentation/asciidoc/computers/raspberry-pi/bootflow-2711.adoc @@ -86,3 +86,6 @@ sudo reboot '0 tryboot' `tryboot` is supported on all Raspberry Pi models, however, on Raspberry Pi 4 Model B revision 1.0 and 1.1 the EEPROM must not be write protected. This is because older Raspberry Pi 4B devices have to reset the power supply (losing the tryboot state) so this is stored inside the EEPROM instead. +If `secure-boot` is enabled then `tryboot` mode will cause `tryboot.img` to be loaded instead of `boot.img`. + + From 191d01c4d2a5cda17d546081cfa5b4521812a3e9 Mon Sep 17 00:00:00 2001 From: Andrew Scheller Date: Wed, 11 May 2022 14:36:22 +0100 Subject: [PATCH 21/27] Minor copy-edit --- .../asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc b/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc index 47945ca39..bb043f745 100644 --- a/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc +++ b/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc @@ -337,7 +337,7 @@ To enable network install, add `NET_INSTALL_ENABLED=1`, or to disable network in This setting is ignored and network install is disabled if `DISABLE_HDMI=1` is set. -In order to detect the keyboard network install must initialise the USB controller and enumerate devices. This increases boot time by approximately 1 second so it may be advantageous to disable network install in some embedded applications. +In order to detect the keyboard, network install must initialise the USB controller and enumerate devices. This increases boot time by approximately 1 second so it may be advantageous to disable network install in some embedded applications. Default: `1` on Raspberry Pi 4 and Raspberry Pi 400, and `0` on Compute Module 4. @@ -392,7 +392,7 @@ Max length: 32 characters [[PARTITION]] ==== PARTITION -The `PARTITION` option may be used to specify the boot partition number if it has not explicitly been set by the `reboot` command (e.g. `sudo reboot N`) or by `boot_partition=N` in `autoboot.txt`. +The `PARTITION` option may be used to specify the boot partition number, if it has not explicitly been set by the `reboot` command (e.g. `sudo reboot N`) or by `boot_partition=N` in `autoboot.txt`. This could be used to boot from a rescue partition if the user presses a button. ---- # Boot from partition 2 if GPIO 7 is pulled low From 3b5ed1d29b1af5eed6dfe80e44c496f4cd9e3245 Mon Sep 17 00:00:00 2001 From: Alasdair Allan Date: Mon, 16 May 2022 15:35:05 +0100 Subject: [PATCH 22/27] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 1d8a30286..0ee296941 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ $ brew install ruby@2.7 If you're using `csh` or `tcsh` add the following lines to your `.cshrc` or `.tcshrc`, ``` +setenv PATH /usr/local/bin:/usr/local/sbin:$PATH + setenv PATH /usr/local/opt/ruby/bin:${PATH} setenv PATH ${PATH}:/usr/local/lib/ruby/gems/2.7.0/bin setenv LDFLAGS -L/usr/local/opt/ruby@2.7/lib @@ -71,6 +73,8 @@ setenv PKG_CONFIG_PATH /usr/local/opt/ruby@2.7/lib/pkgconfig or if you're using `bash` add the following lines to your `.bash_profile`, ``` +export PATH="/usr/local/bin:/usr/local/sbin:$PATH" + export PATH="/usr/local/opt/ruby/bin:$PATH" export PATH="$PATH:/usr/local/lib/ruby/gems/2.7.0/bin" export PATH="/usr/local/opt/ruby@2.7/bin:$PATH" @@ -79,6 +83,8 @@ export CPPFLAGS="-I/usr/local/opt/ruby@2.7/include" export PKG_CONFIG_PATH="/usr/local/opt/ruby@2.7/lib/pkgconfig" ``` +and then open a new Terminal window to make sure you're using the right version of Python and Ruby. + ##### Install Dependencies Go ahead and `brew install` the other dependencies, From bcd5149b57fb48959516d82c9b3b4dca0c2e0f05 Mon Sep 17 00:00:00 2001 From: Alasdair Allan Date: Mon, 16 May 2022 15:59:31 +0100 Subject: [PATCH 23/27] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 0ee296941..3abbe6e3d 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,8 @@ $ brew install ruby@2.7 **NOTE:** Homebrew defaults to Ruby 3.0 which is incompatible with Asciidoctor. +**IMPORTANT:** Homebrew has problems using `/bin/zsh`, you may have to change your default shell to `/bin/bash`. + ##### Set up Homebrew Version of Ruby If you're using `csh` or `tcsh` add the following lines to your `.cshrc` or `.tcshrc`, @@ -82,6 +84,7 @@ export LDFLAGS="-L/usr/local/opt/ruby@2.7/lib" export CPPFLAGS="-I/usr/local/opt/ruby@2.7/include" export PKG_CONFIG_PATH="/usr/local/opt/ruby@2.7/lib/pkgconfig" ``` +NOTE: If you are running macOS on an Apple Silicon based Mac, rather than an Intel Mac, substitute `/opt/homebrew/` for `/usr/local` in the lines dealing with `ruby@2.7` in the above block. and then open a new Terminal window to make sure you're using the right version of Python and Ruby. From 3e26016a5f3ac1adce539aaf36fbcc0cad6dffb4 Mon Sep 17 00:00:00 2001 From: Ziemowit Zabawa Date: Thu, 19 May 2022 22:26:08 +0200 Subject: [PATCH 24/27] Fix typo in libcamera_raw.adoc --- documentation/asciidoc/accessories/camera/libcamera_raw.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/asciidoc/accessories/camera/libcamera_raw.adoc b/documentation/asciidoc/accessories/camera/libcamera_raw.adoc index 002f16253..c372f89db 100644 --- a/documentation/asciidoc/accessories/camera/libcamera_raw.adoc +++ b/documentation/asciidoc/accessories/camera/libcamera_raw.adoc @@ -9,7 +9,7 @@ libcamera-raw -t 2000 -o test.raw The raw frames are dumped with no formatting information at all, one directly after another. The application prints the pixel format and image dimensions to the terminal window so that the user can know how to interpret the pixel data. -By default the raw frames are saved in a single (potentially very large) file. As we saw previously, the `--segement` option can be used conveniently to direct each to a separate file. +By default the raw frames are saved in a single (potentially very large) file. As we saw previously, the `--segment` option can be used conveniently to direct each to a separate file. [,bash] ---- libcamera-raw -t 2000 --segment 1 -o test%05d.raw From 42d3481f6f31131be7b52e4296e4318cc9837a33 Mon Sep 17 00:00:00 2001 From: Tim Gover Date: Fri, 20 May 2022 10:02:43 +0100 Subject: [PATCH 25/27] Document secure-boot config.txt properties This properties are already described in the usbboot repo but now that secure-boot is in the mainline EEPROM release let's include this in the canonical bootloader reference https://github.com/raspberrypi/usbboot/blob/master/secure-boot-recovery/config.txt --- .../raspberry-pi/bcm2711-bootloader.adoc | 48 +++++++++++++++++-- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc b/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc index bb043f745..d85fed8c6 100644 --- a/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc +++ b/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc @@ -489,6 +489,13 @@ XHCI_DEBUG=0x3 Default: `0x0` (no USB debug messages enabled) +[[config_txt]] +==== config.txt section + +After reading `config.txt` the GPU firmware `start4.elf` reads the bootloader EEPROM config and checks for a section called `[config.txt]`. If the `[config.txt]` section exists then the contents from the start of this section to the end of the file is appended in memory, to the contents of the `config.txt` file read from the boot partition. This can be used to automatically apply settings to every operating system, for example, dtoverlays. + +WARNING: If an invalid configuration which causes boot to fail is specified then the bootloader EEPROM will have to be re-flashed. + === Configuration Properties in `config.txt` [[boot_ramdisk]] @@ -504,7 +511,7 @@ The primary purpose of `boot_ramdisk` is to support `secure-boot`, however, unsi For more information about `secure-boot` and creating `boot.img` files please see https://github.com/raspberrypi/usbboot/blob/master/Readme.md[USBBOOT] -Default: `0` +Default: `0` [[boot_load_flags]] ==== boot_load_flags @@ -524,6 +531,13 @@ The `BOOT_UART` property also enables bootloader UART logging but does not enabl Default: `0` +[[erase_eeprom]] +==== erase_eeprom + +If `erase_eeprom` is set to `1` then `recovery.bin` will erase the entire SPI EEPROM instead of flashing the bootloader image. This property has no effect during a normal boot. + +Default: `0` + [[eeprom_write_protect]] ==== eeprom_write_protect @@ -559,12 +573,36 @@ This option may be set to 0 to block self-update without requiring the EEPROM co Default: `1` -[[config_txt]] -==== config.txt section +=== Secure Boot configuration properties in `config.txt` +The following `config.txt` properties are used to program the `secure-boot` OTP settings. These changes are irreversible and can only be programmed via `RPIBOOT` when flashing the bootloader EEPROM image. This ensures that `secure-boot` cannot be set remotely or via accidentally inserting a stale SD card image. -After reading `config.txt` the GPU firmware `start4.elf` reads the bootloader EEPROM config and checks for a section called `[config.txt]`. If the `[config.txt]` section exists then the contents from the start of this section to the end of the file is appended in memory, to the contents of the `config.txt` file read from the boot partition. This can be used to automatically apply settings to every operating system, for example, dtoverlays. +For more information about enabling `secure-boot` please see the https://github.com/raspberrypi/usbboot/blob/master/Readme.md#secure-boot[secure-boot readme] and the https://github.com/raspberrypi/usbboot/blob/master/secure-boot-example/README.md[secure-boot tutorial] in the https://github.com/raspberrypi/usbboot[USBBOOT] repo. -WARNING: If an invalid configuration which causes boot to fail is specified then the bootloader EEPROM will have to be re-flashed. +[[program_pubkey]] +==== program_pubkey +If this property is set to `1` then `recovery.bin` will write the hash of the public key in the EEPROM image to OTP. Once set, the bootloader will reject EEPROM images signed with different RSA keys or unsigned images. + +Default: `0` + +[[revoke_devkey]] +==== revoke_devkey +If this property is set to `1` then `recovery.bin` will write a value to OTP that prevents the ROM from loading old versions of the second stage bootloader which do not support `secure-boot`. This prevents `secure-boot` from being turned off by reverting to an older release of the bootloader. + +Default: `0` + +[[program_rpiboot_gpio]] +==== program_rpiboot_gpio +Since there is no dedicated `nRPIBOOT` jumper on Pi 4B or Pi 400 an alternative GPIO must be used to select `RPIBOOT` mode by pulling the GPIO low. Only one GPIO may be selected and the available options are `2, 4, 5, 7, 8`. This property does not depend on `secure-boot` but please verify that this GPIO configuration does not conflict with any HATs which might pull the GPIO low during boot. + +Since for safety this property can only be programmed via `RPIBOOT` the bootloader EEPROM must first be cleared using `erase_eeprom`. This causes the 2711 ROM to failover to `RPIBOOT` mode allowing this option to be set. + +Default: `` + +[[program_jtag_lock]] +==== program_jtag_lock +If this property is set to `1` then `recovery.bin` will program an OTP value that prevents VideoCore JTAG from being used. This option requires that `program_pubkey` and `revoke_devkey` are also set. This option can prevent failure-analysis and should only be set after the device has been fully tested. + +Default: `0` [[bootloader_update_stable]] === Updating to the LATEST / STABLE bootloader From 585e8717120f813e1d2fae8a5ace68629163d5de Mon Sep 17 00:00:00 2001 From: Andrew Scheller Date: Mon, 23 May 2022 01:31:02 +0100 Subject: [PATCH 26/27] Small copy-edits --- .../asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc b/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc index d85fed8c6..c534d9645 100644 --- a/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc +++ b/documentation/asciidoc/computers/raspberry-pi/bcm2711-bootloader.adoc @@ -574,7 +574,7 @@ This option may be set to 0 to block self-update without requiring the EEPROM co Default: `1` === Secure Boot configuration properties in `config.txt` -The following `config.txt` properties are used to program the `secure-boot` OTP settings. These changes are irreversible and can only be programmed via `RPIBOOT` when flashing the bootloader EEPROM image. This ensures that `secure-boot` cannot be set remotely or via accidentally inserting a stale SD card image. +The following `config.txt` properties are used to program the `secure-boot` OTP settings. These changes are irreversible and can only be programmed via `RPIBOOT` when flashing the bootloader EEPROM image. This ensures that `secure-boot` cannot be set remotely or by accidentally inserting a stale SD card image. For more information about enabling `secure-boot` please see the https://github.com/raspberrypi/usbboot/blob/master/Readme.md#secure-boot[secure-boot readme] and the https://github.com/raspberrypi/usbboot/blob/master/secure-boot-example/README.md[secure-boot tutorial] in the https://github.com/raspberrypi/usbboot[USBBOOT] repo. @@ -592,9 +592,9 @@ Default: `0` [[program_rpiboot_gpio]] ==== program_rpiboot_gpio -Since there is no dedicated `nRPIBOOT` jumper on Pi 4B or Pi 400 an alternative GPIO must be used to select `RPIBOOT` mode by pulling the GPIO low. Only one GPIO may be selected and the available options are `2, 4, 5, 7, 8`. This property does not depend on `secure-boot` but please verify that this GPIO configuration does not conflict with any HATs which might pull the GPIO low during boot. +Since there is no dedicated `nRPIBOOT` jumper on Raspberry Pi 4B or Raspberry Pi 400, an alternative GPIO must be used to select `RPIBOOT` mode by pulling the GPIO low. Only one GPIO may be selected and the available options are `2, 4, 5, 7, 8`. This property does not depend on `secure-boot` but please verify that this GPIO configuration does not conflict with any HATs which might pull the GPIO low during boot. -Since for safety this property can only be programmed via `RPIBOOT` the bootloader EEPROM must first be cleared using `erase_eeprom`. This causes the 2711 ROM to failover to `RPIBOOT` mode allowing this option to be set. +Since for safety this property can only be programmed via `RPIBOOT`, the bootloader EEPROM must first be cleared using `erase_eeprom`. This causes the BCM2711 ROM to failover to `RPIBOOT` mode, which then allows this option to be set. Default: `` From 5cbb3c0c1863f14301909a3c63b6ab1f16aa9879 Mon Sep 17 00:00:00 2001 From: Andrew Scheller Date: Mon, 23 May 2022 12:59:09 +0100 Subject: [PATCH 27/27] Fix redirects to match #2519 --- documentation/htaccess_extra.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/documentation/htaccess_extra.txt b/documentation/htaccess_extra.txt index 14b1d538f..fa10f66fd 100644 --- a/documentation/htaccess_extra.txt +++ b/documentation/htaccess_extra.txt @@ -19,7 +19,6 @@ RedirectMatch 302 "^/documentation/installation/" "/documentation/computers/gett RedirectMatch 302 "^/documentation/linux/kernel/" "/documentation/computers/linux_kernel.html" RedirectMatch 302 "^/documentation/linux/software/libcamera/" "/documentation/accessories/camera.html" RedirectMatch 302 "^/documentation/linux/software/" "/documentation/computers/os.html" -RedirectMatch 302 "^/documentation/linux/" "/documentation/computers/using_linux.html" RedirectMatch 302 "^/documentation/raspbian/" "/documentation/computers/os.html" RedirectMatch 302 "^/documentation/remote-access/" "/documentation/computers/remote-access.html" RedirectMatch 302 "^/documentation/setup/" "/documentation/computers/getting-started.html"