Compare commits
16 Commits
ee93757ff1
...
68e6e1091e
Author | SHA1 | Date |
---|---|---|
Takumi Sueda | 68e6e1091e | |
Takumi Sueda | ce8d780b33 | |
Takumi Sueda | b561fdaec9 | |
Takumi Sueda | 611706771f | |
Takumi Sueda | 2fa3904480 | |
Takumi Sueda | 3479812f91 | |
Takumi Sueda | 94d37b1b76 | |
Takumi Sueda | d6719fd49f | |
Takumi Sueda | 1de1747fbb | |
Takumi Sueda | d885ca6bc1 | |
Takumi Sueda | b242f06d78 | |
Takumi Sueda | d534aa7416 | |
Takumi Sueda | 870363a92e | |
Takumi Sueda | 8ca8a3ab12 | |
Takumi Sueda | 33e3afbf13 | |
Takumi Sueda | bc2c108d77 |
|
@ -12,7 +12,7 @@ jobs:
|
||||||
outputs:
|
outputs:
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: false
|
submodules: false
|
||||||
|
@ -41,7 +41,7 @@ jobs:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
needs: [create_release]
|
needs: [create_release]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Workaround for apt update failure
|
- name: Workaround for apt update failure
|
||||||
|
@ -91,7 +91,7 @@ jobs:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
needs: [create_release]
|
needs: [create_release]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Workaround for apt update failure
|
- name: Workaround for apt update failure
|
||||||
|
@ -154,7 +154,7 @@ jobs:
|
||||||
lilo: gen3_7.bin
|
lilo: gen3_7.bin
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Workaround for apt update failure
|
- name: Workaround for apt update failure
|
||||||
|
@ -200,7 +200,7 @@ jobs:
|
||||||
- model: h1
|
- model: h1
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Workaround for apt update failure
|
- name: Workaround for apt update failure
|
||||||
|
@ -234,7 +234,7 @@ jobs:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
needs: [create_release]
|
needs: [create_release]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Make /opt writable
|
- name: Make /opt writable
|
||||||
|
@ -277,7 +277,7 @@ jobs:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
needs: [create_release]
|
needs: [create_release]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Workaround for apt update failure
|
- name: Workaround for apt update failure
|
||||||
|
|
|
@ -13,3 +13,6 @@
|
||||||
[submodule "brainlilo"]
|
[submodule "brainlilo"]
|
||||||
path = brainlilo
|
path = brainlilo
|
||||||
url = https://github.com/brain-hackers/brainlilo.git
|
url = https://github.com/brain-hackers/brainlilo.git
|
||||||
|
[submodule "buildroot"]
|
||||||
|
path = buildroot
|
||||||
|
url = https://github.com/brain-hackers/buildroot.git
|
||||||
|
|
16
Makefile
16
Makefile
|
@ -135,7 +135,6 @@ lilobuild:
|
||||||
liloclean:
|
liloclean:
|
||||||
make -C ./brainlilo clean
|
make -C ./brainlilo clean
|
||||||
|
|
||||||
|
|
||||||
brainux:
|
brainux:
|
||||||
@if [ "$(shell uname)" != "Linux" ]; then \
|
@if [ "$(shell uname)" != "Linux" ]; then \
|
||||||
echo "Debootstrap is only available in Linux!"; \
|
echo "Debootstrap is only available in Linux!"; \
|
||||||
|
@ -150,15 +149,26 @@ brainux:
|
||||||
fi
|
fi
|
||||||
sudo cp /usr/bin/qemu-arm-static brainux/usr/bin/
|
sudo cp /usr/bin/qemu-arm-static brainux/usr/bin/
|
||||||
sudo cp ./os-brainux/setup_brainux.sh brainux/
|
sudo cp ./os-brainux/setup_brainux.sh brainux/
|
||||||
|
sudo ./os-brainux/override-pre.sh ./os-brainux/override ./brainux
|
||||||
sudo -E chroot brainux /setup_brainux.sh
|
sudo -E chroot brainux /setup_brainux.sh
|
||||||
sudo rm brainux/setup_brainux.sh
|
sudo rm brainux/setup_brainux.sh
|
||||||
sudo ./os-brainux/override.sh ./os-brainux/override ./brainux
|
sudo ./os-brainux/override.sh ./os-brainux/override ./brainux
|
||||||
|
|
||||||
|
buildroot_rootfs:
|
||||||
|
make -C buildroot brain_imx28_defconfig
|
||||||
|
make -C buildroot -j 12
|
||||||
|
sudo mkdir -p buildroot_rootfs
|
||||||
|
sudo tar -C ./buildroot_rootfs -xf buildroot/output/images/rootfs.tar
|
||||||
|
|
||||||
image/sd.img: clean_work
|
image/sd.img: clean_work
|
||||||
./image/build_image.sh
|
./image/build_image.sh brainux sd.img 3072
|
||||||
|
|
||||||
image/sd_x1.img: clean_work
|
image/sd_x1.img: clean_work
|
||||||
./image/build_image_x1.sh
|
./image/build_image_x1.sh brainux sd_x1.img 3072
|
||||||
|
|
||||||
|
image/sd_buildroot.img: clean_work
|
||||||
|
./image/build_image.sh buildroot_rootfs sd_buildroot.img 128
|
||||||
|
|
||||||
|
|
||||||
.PHONY:
|
.PHONY:
|
||||||
clean_work:
|
clean_work:
|
||||||
|
|
20
README.md
20
README.md
|
@ -94,8 +94,8 @@ Build Linux
|
||||||
1. Confirm that `linux-brain/arch/arm/boot/zImage` exists.
|
1. Confirm that `linux-brain/arch/arm/boot/zImage` exists.
|
||||||
|
|
||||||
|
|
||||||
Bootstrap Debian 11 (bullseye)
|
Build a Debian rootfs
|
||||||
------------------------------
|
---------------------
|
||||||
|
|
||||||
1. Run `make ldefconfig lbuild`.
|
1. Run `make ldefconfig lbuild`.
|
||||||
|
|
||||||
|
@ -107,9 +107,23 @@ Bootstrap Debian 11 (bullseye)
|
||||||
|
|
||||||
1. Confirm that `image/sd.img` is built and burn it to an SD card.
|
1. Confirm that `image/sd.img` is built and burn it to an SD card.
|
||||||
|
|
||||||
|
|
||||||
|
Build a Buildroot rootfs
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
Buildroot rootfs aims to be the most lightweight rootfs for experimental use. `make buildroot_rootfs` runs the defconfig target for rootfs-only build and then builds the rootfs tarball and a CPIO archive for initramfs. `make image/sd_buildroot.img` makes a bootable SD image in `image` directory like the typical Brainux SD image.
|
||||||
|
|
||||||
|
If you want to customize the build of Buildroot, `cd` into `buildroot` and use the following targets:
|
||||||
|
|
||||||
|
- `make menuconfig` to change the configuration
|
||||||
|
- `make` to build the rootfs (`-j` option might give you extra speed)
|
||||||
|
|
||||||
|
`image/sd_buildroot.img` target expects presence of the tarball at `buildroot/output/images/rootfs.tar`. You'll have to `clean` and rebuild every time you change the Buildroot's config before making the SD image.
|
||||||
|
|
||||||
|
|
||||||
Known issues
|
Known issues
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
If you using gcc 10 for host compiler, `make ubuild` may fail.
|
If you use GCC 10 for the host compiler, `make ubuild` may fail.
|
||||||
To complete build, open `/u-boot-brain/scripts/dtc/dtc-lexer.lex.c` or `/u-boot-brain/scripts/dtc/dtc-parser.tab.c` then comment out `YYLTYPE yylloc;`
|
To complete build, open `/u-boot-brain/scripts/dtc/dtc-lexer.lex.c` or `/u-boot-brain/scripts/dtc/dtc-parser.tab.c` then comment out `YYLTYPE yylloc;`
|
||||||
|
|
||||||
Watch changes in submodules & auto-build
|
Watch changes in submodules & auto-build
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit cf3ea901082f470449bd174272d8407e039522b2
|
|
@ -5,7 +5,10 @@ JOBS=$(nproc)
|
||||||
REPO=$(git rev-parse --show-toplevel)
|
REPO=$(git rev-parse --show-toplevel)
|
||||||
WORK=${REPO}/image/work
|
WORK=${REPO}/image/work
|
||||||
LINUX=${REPO}/linux-brain
|
LINUX=${REPO}/linux-brain
|
||||||
IMG=${REPO}/image/sd.img
|
ROOTFS=$1
|
||||||
|
IMG_NAME=$2
|
||||||
|
IMG=${REPO}/image/${IMG_NAME}
|
||||||
|
SIZE_M=$3
|
||||||
export CROSS_COMPILE=arm-linux-gnueabi-
|
export CROSS_COMPILE=arm-linux-gnueabi-
|
||||||
|
|
||||||
mkdir -p ${WORK}
|
mkdir -p ${WORK}
|
||||||
|
@ -34,7 +37,7 @@ for i in "a7200" "sh1" "sh2" "sh3" "sh4" "sh5" "sh6" "sh7"; do
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
dd if=/dev/zero of=${IMG} bs=1M count=3072
|
dd if=/dev/zero of=${IMG} bs=1M count=${SIZE_M}
|
||||||
|
|
||||||
START1=2048
|
START1=2048
|
||||||
SECTORS1=$((1024 * 1024 * 64 / 512))
|
SECTORS1=$((1024 * 1024 * 64 / 512))
|
||||||
|
@ -49,7 +52,7 @@ sfdisk ${IMG} < ${WORK}/part.sfdisk
|
||||||
|
|
||||||
sudo kpartx -av ${IMG}
|
sudo kpartx -av ${IMG}
|
||||||
|
|
||||||
LOOPDEV=$(losetup -l | grep sd.img | grep -o 'loop.' | tail -n 1)
|
LOOPDEV=$(losetup -l | grep ${IMG_NAME} | grep -o 'loop.' | tail -n 1)
|
||||||
|
|
||||||
sudo mkfs.fat -n boot -F32 -v -I /dev/mapper/${LOOPDEV}p1
|
sudo mkfs.fat -n boot -F32 -v -I /dev/mapper/${LOOPDEV}p1
|
||||||
sudo mkfs.ext4 -L rootfs /dev/mapper/${LOOPDEV}p2
|
sudo mkfs.ext4 -L rootfs /dev/mapper/${LOOPDEV}p2
|
||||||
|
@ -71,13 +74,13 @@ sudo touch "${LILO}/index.din"
|
||||||
sudo touch "${LILO}/AppMain.cfg"
|
sudo touch "${LILO}/AppMain.cfg"
|
||||||
sudo cp ${REPO}/brainlilo/*.dll "${LILO}/"
|
sudo cp ${REPO}/brainlilo/*.dll "${LILO}/"
|
||||||
sudo cp ${REPO}/brainlilo/BrainLILO.exe "${LILO}/AppMain_.exe"
|
sudo cp ${REPO}/brainlilo/BrainLILO.exe "${LILO}/AppMain_.exe"
|
||||||
gzip -d ${REPO}/image/exeopener.exe.gz
|
gzip -cd ${REPO}/image/exeopener.exe.gz > ${REPO}/image/exeopener.exe
|
||||||
sudo cp ${REPO}/image/exeopener.exe "${LILO}/AppMain.exe"
|
sudo cp ${REPO}/image/exeopener.exe "${LILO}/AppMain.exe"
|
||||||
|
|
||||||
sudo mkdir -p ${WORK}/p1/loader
|
sudo mkdir -p ${WORK}/p1/loader
|
||||||
sudo cp ${WORK}/lilobin/*.bin ${WORK}/p1/loader/
|
sudo cp ${WORK}/lilobin/*.bin ${WORK}/p1/loader/
|
||||||
|
|
||||||
sudo cp -ra ${REPO}/brainux/* ${WORK}/p2/
|
sudo cp -ra ${REPO}/${ROOTFS}/* ${WORK}/p2/
|
||||||
|
|
||||||
sudo umount ${WORK}/p1 ${WORK}/p2
|
sudo umount ${WORK}/p1 ${WORK}/p2
|
||||||
sudo kpartx -d ${IMG}
|
sudo kpartx -d ${IMG}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -uex -o pipefail
|
||||||
|
|
||||||
|
SRC=$1
|
||||||
|
DST=$2
|
||||||
|
|
||||||
|
install -g root -o root -m 0644 $SRC/lib/systemd/system/boot.mount $DST/lib/systemd/system/boot.mount
|
||||||
|
install -g root -o root -m 0644 $SRC/lib/systemd/system/rndis_gadget.service $DST/lib/systemd/system/rndis_gadget.service
|
||||||
|
install -g root -o root -m 0755 $SRC/usr/bin/enable_rndis_gadget $DST/usr/bin/enable_rndis_gadget
|
|
@ -0,0 +1,10 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Mount boot partition
|
||||||
|
|
||||||
|
[Mount]
|
||||||
|
What=/dev/mmcblk1p1
|
||||||
|
Where=/boot
|
||||||
|
Options=ro
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
|
@ -0,0 +1,9 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Enable RNDIS USB Gadget
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/bin/enable_rndis_gadget
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
g=/sys/kernel/config/usb_gadget/eth
|
||||||
|
|
||||||
|
mkdir ${g}
|
||||||
|
|
||||||
|
echo "0x3066" > ${g}/bcdDevice
|
||||||
|
echo "1" > ${g}/os_desc/use
|
||||||
|
echo "0xcd" > ${g}/os_desc/b_vendor_code
|
||||||
|
echo "MSFT100" > ${g}/os_desc/qw_sign
|
||||||
|
|
||||||
|
mkdir ${g}/functions/rndis.rn0
|
||||||
|
echo "RNDIS" > ${g}/functions/rndis.rn0/os_desc/interface.rndis/compatible_id
|
||||||
|
echo "5162001" > ${g}/functions/rndis.rn0/os_desc/interface.rndis/sub_compatible_id
|
||||||
|
echo "8a:15:8b:44:3a:02" > ${g}/functions/rndis.rn0/dev_addr
|
||||||
|
echo "8a:15:8b:44:3a:01" > ${g}/functions/rndis.rn0/host_addr
|
||||||
|
|
||||||
|
mkdir ${g}/configs/c.1
|
||||||
|
ln -s ${g}/functions/rndis.rn0 ${g}/configs/c.1/
|
||||||
|
|
||||||
|
echo "ci_hdrc.0" > ${g}/UDC
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
ifconfig usb0 up
|
||||||
|
dhclient
|
|
@ -136,6 +136,12 @@ ttymxc0
|
||||||
ttyLP0
|
ttyLP0
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
# Enable /boot mount
|
||||||
|
systemctl enable boot.mount
|
||||||
|
|
||||||
|
# Enable RNDIS gadget
|
||||||
|
systemctl enable rndis_gadget
|
||||||
|
|
||||||
# Get wild
|
# Get wild
|
||||||
cat <<EOF > /etc/apt/sources.list
|
cat <<EOF > /etc/apt/sources.list
|
||||||
deb http://deb.debian.org/debian bullseye main contrib non-free
|
deb http://deb.debian.org/debian bullseye main contrib non-free
|
||||||
|
|
|
@ -0,0 +1,112 @@
|
||||||
|
#!/bin/sh
|
||||||
|
set -u
|
||||||
|
|
||||||
|
VERBOSE=0
|
||||||
|
PIN=""
|
||||||
|
SLEEP=1
|
||||||
|
GPIOS=""
|
||||||
|
|
||||||
|
while getopts "hvr:p:s:" OPT; do
|
||||||
|
case "$OPT" in
|
||||||
|
h)
|
||||||
|
echo "Usage: blink.sh [-hv] [-r PIN_RANGE_FROM-PIN_RANGE_TO] [-p PIN] [-s SLEEP_SEC]"
|
||||||
|
echo "Example: blink.sh -r 0-10 -p 12"
|
||||||
|
echo " (blink from GPIO 0 to 10 and 12)"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
VERBOSE=1
|
||||||
|
;;
|
||||||
|
r)
|
||||||
|
RE='^([0-9]+)-([0-9]+)$'
|
||||||
|
if echo $OPTARG | grep -qvE $RE; then
|
||||||
|
echo "Error: invalid range: $OPTARG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
FROM=$(echo $OPTARG | sed -E "s/$RE/\\1/")
|
||||||
|
TO=$(echo $OPTARG | sed -E "s/$RE/\\2/")
|
||||||
|
GPIOS="$GPIOS$(seq -s " " $FROM $TO) "
|
||||||
|
;;
|
||||||
|
p)
|
||||||
|
if echo $OPTARG | grep -qvE "^[0-9]+$"; then
|
||||||
|
echo "Error: invalid pin number: $OPTARG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
GPIOS="$GPIOS$OPTARG "
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
if echo $OPTARG | grep -qvE "^[0-9]+$"; then
|
||||||
|
echo "Error: invalid sleep duration: $OPTARG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
SLEEP=$OPTARG
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $VERBOSE -eq 1 ]; then
|
||||||
|
echo "Pins to iterate over: $GPIOS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$(id -u)" -ne "0" ]; then
|
||||||
|
echo "Error: please run as root"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
AVAILABLE_GPIOS=""
|
||||||
|
|
||||||
|
export_gpio() {
|
||||||
|
echo $1 > /sys/class/gpio/export
|
||||||
|
}
|
||||||
|
|
||||||
|
set_direction() {
|
||||||
|
echo out > /sys/class/gpio/gpio$1/direction
|
||||||
|
}
|
||||||
|
|
||||||
|
set_value() {
|
||||||
|
echo $2 > /sys/class/gpio/gpio$1/value
|
||||||
|
}
|
||||||
|
|
||||||
|
for i in $GPIOS; do
|
||||||
|
if [ ! -e "/sys/class/gpio/gpio$i" ]; then
|
||||||
|
export_gpio $i 2>/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error: failed to export the pin $i"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
set_direction $i 2>/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
# Ignore the failure if the actual direction is out
|
||||||
|
if grep -vq "out" /dsys/class/gpio/gpio$i/direction; then
|
||||||
|
echo "Error: failed to set the direction of the pin $i to out"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
AVAILABLE_GPIOS="$AVAILABLE_GPIOS$i "
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Available GPIOs: $AVAILABLE_GPIOS"
|
||||||
|
|
||||||
|
while [ 1 ]; do
|
||||||
|
for i in $AVAILABLE_GPIOS; do
|
||||||
|
set_value $i 1 2>/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Warning: failed to set the value of the pin $i to high"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
sleep $SLEEP
|
||||||
|
|
||||||
|
for i in $AVAILABLE_GPIOS; do
|
||||||
|
set_value $i 0 2>/dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Warning: failed to set the value of the pin $i to low"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
sleep $SLEEP
|
||||||
|
done
|
||||||
|
|
Loading…
Reference in New Issue