forked from thesofproject/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow bare minimum platform device core and driver to be easily tested
Provide a forked `defconfig` and devicetree, so the platform device core and driver can be easily tested on QEMU, or a Raspberri Pi Zero. Although called "bcm2835-rng-rust", this is not a functional hwrng driver, just a bare minimum platform_device. All it will do is log a message to dmesg: [ ] rust_kernel: Rust platform_device probed and show up in sysfs: /sys/bus/platform/driver/bcm2835-rng-rust/ (the driver) /sys/bus/platform/devices/bcm2835-rng-rust/ (the device) How to run on QEMU ================== Download a Raspbian image. I used `2021-03-04-raspios-buster-armhf-lite.img`. It will consist of two partitions. Discover their offsets using: ```sh $ fdisk -l 2021-03-04-raspios-buster-armhf-lite.img Device Boot Start End Sectors Size Id Type 2021-03-04-raspios-buster-armhf-lite.img1 8192 532479 524288 256M c W95 FAT32 (LBA) 2021-03-04-raspios-buster-armhf-lite.img2 532480 3645439 3112960 1.5G 83 Linux ``` Mount the second partition on your PC: (note how the offset is multiplied by 512) ```sh $ mount -o loop,offset=$((512*532480)) 2021-03-04-raspios-buster-armhf-lite.img /mnt Comment out everything in /etc/ld.so.preload - otherwise the Raspbian rootfs cannot support a mainline kernel: $ vi /etc/ld.so.preload # comment everything out $ umount /mnt ``` Build the kernel for arm 32-bit: ```sh $ make bcm2835_rust_defconfig # defconfig forked so `bcm2835-rng-rust` binds to our driver $ make zImage dtbs modules ``` Start QEMU: ```sh # to boot mainline, make sure that /etc/ld.so.preload is commented out # in the Raspbian image. qemu-system-arm \ -M raspi2 \ -append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootwait" \ -cpu arm1176 \ -dtb bcm2836-rpi-2-b-rust.dts \ -hda ./2021-03-04-raspios-buster-armhf-lite.img \ -kernel zImage \ -m 1G \ -smp 4 \ -nographic \ ; How to run on a Raspberry Pi Zero(W) ==================================== Follow the instructions for QEMU above. Deploy the Raspbian image to SD card. Copy zImage and bcm2835-rpi-zero-w-rust.dtb to Raspbian's first (boot) partition: ``` zImage -> boot partition: kernel.img bcm2835-rpi-zero-w-rust.dtb -> boot partition: bcm2708-rpi-0-w.dtb ``` If you'd like wifi to keep working, also copy the kernel modules you built to Raspbian's second partition: ```sh $ make modules_install INSTALL_MOD_PATH=<somewhere> $ cp -rfa <somewhere> <Raspbian Partition> # should end up in /lib/modules/5.12.0-rc4+/ ``` Signed-off-by: Sven Van Asbroeck <thesven73@gmail.com>
- Loading branch information
Sven Van Asbroeck
committed
May 18, 2021
1 parent
b136c6a
commit 9551aa5
Showing
4 changed files
with
494 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
/* | ||
* Copyright (C) 2017 Stefan Wahren <stefan.wahren@i2se.com> | ||
*/ | ||
|
||
/dts-v1/; | ||
#include "bcm2835.dtsi" | ||
#include "bcm2835-rpi.dtsi" | ||
#include "bcm283x-rpi-usb-otg.dtsi" | ||
|
||
/ { | ||
compatible = "raspberrypi,model-zero-w", "brcm,bcm2835"; | ||
model = "Raspberry Pi Zero W"; | ||
|
||
bcm2835-rng-rust { | ||
compatible = "brcm,bcm2835-rng"; | ||
status = "okay"; | ||
}; | ||
|
||
memory@0 { | ||
device_type = "memory"; | ||
reg = <0 0x20000000>; | ||
}; | ||
|
||
chosen { | ||
/* 8250 auxiliary UART instead of pl011 */ | ||
stdout-path = "serial1:115200n8"; | ||
}; | ||
|
||
leds { | ||
act { | ||
gpios = <&gpio 47 GPIO_ACTIVE_LOW>; | ||
}; | ||
}; | ||
|
||
wifi_pwrseq: wifi-pwrseq { | ||
compatible = "mmc-pwrseq-simple"; | ||
reset-gpios = <&gpio 41 GPIO_ACTIVE_LOW>; | ||
}; | ||
}; | ||
|
||
&gpio { | ||
/* | ||
* This is based on the official GPU firmware DT blob. | ||
* | ||
* Legend: | ||
* "NC" = not connected (no rail from the SoC) | ||
* "FOO" = GPIO line named "FOO" on the schematic | ||
* "FOO_N" = GPIO line named "FOO" on schematic, active low | ||
*/ | ||
gpio-line-names = "ID_SDA", | ||
"ID_SCL", | ||
"SDA1", | ||
"SCL1", | ||
"GPIO_GCLK", | ||
"GPIO5", | ||
"GPIO6", | ||
"SPI_CE1_N", | ||
"SPI_CE0_N", | ||
"SPI_MISO", | ||
"SPI_MOSI", | ||
"SPI_SCLK", | ||
"GPIO12", | ||
"GPIO13", | ||
/* Serial port */ | ||
"TXD0", | ||
"RXD0", | ||
"GPIO16", | ||
"GPIO17", | ||
"GPIO18", | ||
"GPIO19", | ||
"GPIO20", | ||
"GPIO21", | ||
"GPIO22", | ||
"GPIO23", | ||
"GPIO24", | ||
"GPIO25", | ||
"GPIO26", | ||
"GPIO27", | ||
"SDA0", | ||
"SCL0", | ||
"NC", /* GPIO30 */ | ||
"NC", /* GPIO31 */ | ||
"NC", /* GPIO32 */ | ||
"NC", /* GPIO33 */ | ||
"NC", /* GPIO34 */ | ||
"NC", /* GPIO35 */ | ||
"NC", /* GPIO36 */ | ||
"NC", /* GPIO37 */ | ||
"NC", /* GPIO38 */ | ||
"NC", /* GPIO39 */ | ||
"CAM_GPIO1", /* GPIO40 */ | ||
"WL_ON", /* GPIO41 */ | ||
"NC", /* GPIO42 */ | ||
"WIFI_CLK", /* GPIO43 */ | ||
"CAM_GPIO0", /* GPIO44 */ | ||
"BT_ON", /* GPIO45 */ | ||
"HDMI_HPD_N", | ||
"STATUS_LED_N", | ||
/* Used by SD Card */ | ||
"SD_CLK_R", | ||
"SD_CMD_R", | ||
"SD_DATA0_R", | ||
"SD_DATA1_R", | ||
"SD_DATA2_R", | ||
"SD_DATA3_R"; | ||
|
||
pinctrl-0 = <&gpioout &alt0>; | ||
}; | ||
|
||
&hdmi { | ||
hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>; | ||
power-domains = <&power RPI_POWER_DOMAIN_HDMI>; | ||
status = "okay"; | ||
}; | ||
|
||
&sdhci { | ||
#address-cells = <1>; | ||
#size-cells = <0>; | ||
pinctrl-names = "default"; | ||
pinctrl-0 = <&emmc_gpio34 &gpclk2_gpio43>; | ||
bus-width = <4>; | ||
mmc-pwrseq = <&wifi_pwrseq>; | ||
non-removable; | ||
status = "okay"; | ||
|
||
brcmf: wifi@1 { | ||
reg = <1>; | ||
compatible = "brcm,bcm4329-fmac"; | ||
}; | ||
}; | ||
|
||
&sdhost { | ||
pinctrl-names = "default"; | ||
pinctrl-0 = <&sdhost_gpio48>; | ||
bus-width = <4>; | ||
status = "okay"; | ||
}; | ||
|
||
&uart0 { | ||
pinctrl-names = "default"; | ||
pinctrl-0 = <&uart0_gpio32 &uart0_ctsrts_gpio30>; | ||
status = "okay"; | ||
|
||
bluetooth { | ||
compatible = "brcm,bcm43438-bt"; | ||
max-speed = <2000000>; | ||
shutdown-gpios = <&gpio 45 GPIO_ACTIVE_HIGH>; | ||
}; | ||
}; | ||
|
||
&uart1 { | ||
pinctrl-names = "default"; | ||
pinctrl-0 = <&uart1_gpio14>; | ||
status = "okay"; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/dts-v1/; | ||
#include "bcm2836.dtsi" | ||
#include "bcm2836-rpi.dtsi" | ||
#include "bcm283x-rpi-smsc9514.dtsi" | ||
#include "bcm283x-rpi-usb-host.dtsi" | ||
|
||
/ { | ||
compatible = "raspberrypi,2-model-b", "brcm,bcm2836"; | ||
model = "Raspberry Pi 2 Model B"; | ||
|
||
memory@0 { | ||
device_type = "memory"; | ||
reg = <0 0x40000000>; | ||
}; | ||
|
||
bcm2835-rng-rust { | ||
compatible = "brcm,bcm2835-rng"; | ||
status = "okay"; | ||
}; | ||
|
||
leds { | ||
act { | ||
gpios = <&gpio 47 GPIO_ACTIVE_HIGH>; | ||
}; | ||
|
||
pwr { | ||
label = "PWR"; | ||
gpios = <&gpio 35 GPIO_ACTIVE_HIGH>; | ||
default-state = "keep"; | ||
linux,default-trigger = "default-on"; | ||
}; | ||
}; | ||
}; | ||
|
||
&gpio { | ||
/* | ||
* Taken from rpi_SCH_2b_1p2_reduced.pdf and | ||
* the official GPU firmware DT blob. | ||
* | ||
* Legend: | ||
* "NC" = not connected (no rail from the SoC) | ||
* "FOO" = GPIO line named "FOO" on the schematic | ||
* "FOO_N" = GPIO line named "FOO" on schematic, active low | ||
*/ | ||
gpio-line-names = "ID_SDA", | ||
"ID_SCL", | ||
"SDA1", | ||
"SCL1", | ||
"GPIO_GCLK", | ||
"GPIO5", | ||
"GPIO6", | ||
"SPI_CE1_N", | ||
"SPI_CE0_N", | ||
"SPI_MISO", | ||
"SPI_MOSI", | ||
"SPI_SCLK", | ||
"GPIO12", | ||
"GPIO13", | ||
/* Serial port */ | ||
"TXD0", | ||
"RXD0", | ||
"GPIO16", | ||
"GPIO17", | ||
"GPIO18", | ||
"GPIO19", | ||
"GPIO20", | ||
"GPIO21", | ||
"GPIO22", | ||
"GPIO23", | ||
"GPIO24", | ||
"GPIO25", | ||
"GPIO26", | ||
"GPIO27", | ||
"SDA0", | ||
"SCL0", | ||
"", /* GPIO30 */ | ||
"LAN_RUN", | ||
"CAM_GPIO1", | ||
"", /* GPIO33 */ | ||
"", /* GPIO34 */ | ||
"PWR_LOW_N", | ||
"", /* GPIO36 */ | ||
"", /* GPIO37 */ | ||
"USB_LIMIT", | ||
"", /* GPIO39 */ | ||
"PWM0_OUT", | ||
"CAM_GPIO0", | ||
"SMPS_SCL", | ||
"SMPS_SDA", | ||
"ETHCLK", | ||
"PWM1_OUT", | ||
"HDMI_HPD_N", | ||
"STATUS_LED", | ||
/* Used by SD Card */ | ||
"SD_CLK_R", | ||
"SD_CMD_R", | ||
"SD_DATA0_R", | ||
"SD_DATA1_R", | ||
"SD_DATA2_R", | ||
"SD_DATA3_R"; | ||
|
||
pinctrl-0 = <&gpioout &alt0 &i2s_alt0>; | ||
|
||
/* I2S interface */ | ||
i2s_alt0: i2s_alt0 { | ||
brcm,pins = <18 19 20 21>; | ||
brcm,function = <BCM2835_FSEL_ALT0>; | ||
}; | ||
}; | ||
|
||
&hdmi { | ||
hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>; | ||
power-domains = <&power RPI_POWER_DOMAIN_HDMI>; | ||
status = "okay"; | ||
}; | ||
|
||
&pwm { | ||
pinctrl-names = "default"; | ||
pinctrl-0 = <&pwm0_gpio40 &pwm1_gpio45>; | ||
status = "okay"; | ||
}; | ||
|
||
&sdhost { | ||
pinctrl-names = "default"; | ||
pinctrl-0 = <&sdhost_gpio48>; | ||
bus-width = <4>; | ||
status = "okay"; | ||
}; | ||
|
||
&uart0 { | ||
pinctrl-names = "default"; | ||
pinctrl-0 = <&uart0_gpio14>; | ||
status = "okay"; | ||
}; |
Oops, something went wrong.