add kernel modules

Wifi and Bluetooth for Pi Zero

Closes #1
This commit is contained in:
Doridian 2022-09-06 06:54:16 -07:00 committed by oliverpool
parent afbd6e4d63
commit 772113207e
2 changed files with 50 additions and 66 deletions

View file

@ -52,4 +52,4 @@ jobs:
uses: stefanzweifel/git-auto-commit-action@v4 uses: stefanzweifel/git-auto-commit-action@v4
with: with:
commit_message: kernel ${{steps.fetch.outputs.version}} commit_message: kernel ${{steps.fetch.outputs.version}}
tagging_message: v1.0.1-${{steps.fetch.outputs.version}} tagging_message: v1.0.2-${{steps.fetch.outputs.version}}

View file

@ -1,18 +1,16 @@
package main package main
import ( import (
"bufio"
"flag" "flag"
"fmt" "fmt"
"io" "io"
"io/fs"
"log" "log"
"os" "os"
"os/user" "os/user"
"path"
"path/filepath" "path/filepath"
"runtime" "runtime"
"strconv" "strconv"
"strings"
"github.com/magefile/mage/sh" "github.com/magefile/mage/sh"
) )
@ -50,7 +48,7 @@ func run() error {
"run", "run",
"--rm", // cleanup afterwards "--rm", // cleanup afterwards
"-v", kernelFolder+":/root/armhf", "-v", kernelFolder+":/root/armhf",
"ghcr.io/gokrazy-community/crossbuild-armhf:impish-20220316", "ghcr.io/gokrazy-community/crossbuild-armhf:jammy-20220815",
) )
// change the owner of the files inside docker to the current user // change the owner of the files inside docker to the current user
chown := func(folder string) error { chown := func(folder string) error {
@ -65,24 +63,48 @@ func run() error {
if err := dockerRun("make", "bcmrpi_defconfig"); err != nil { if err := dockerRun("make", "bcmrpi_defconfig"); err != nil {
return err return err
} }
if err := chown(".config"); err != nil { // disable all modules (TODO: replace with mod2noconfig once we have 5.17 or newer)
if err := dockerRun("sed", "s/=m$/=n/i", "-i", ".config"); err != nil {
return err return err
} }
// adjust config to add CONFIG_SQUASHFS and CONFIG_IPV6 // https://stackoverflow.com/a/56515886
configPath := filepath.Join(kernelFolder, ".config") // it doesn't check the validity of the .config file
err = adjustTextFile(configPath, func(line string) bool { // so we run make olddefconfig afterwards
return strings.HasPrefix(line, "CONFIG_SQUASHFS=") || strings.HasPrefix(line, "CONFIG_IPV6=") args := []string{"./scripts/config",
}, []string{ // Basics
"CONFIG_SQUASHFS=y", "--set-val", "SQUASHFS", "y",
"CONFIG_IPV6=y", "--set-val", "IPV6", "y",
}) "--set-val", "MODULES", "y",
if err != nil {
// Disable module compression (wifi needs this)
"--set-val", "MODULE_COMPRESS_NONE", "y",
"--set-val", "MODULE_COMPRESS_GZIP", "n",
"--set-val", "MODULE_COMPRESS_XZ", "n",
"--set-val", "MODULE_COMPRESS_ZSTD", "n",
// WiFi
"--set-val", "RFKILL", "y",
"--set-val", "CFG80211", "y",
"--set-val", "BRCMFMAC", "m",
// Bluetooth
"--set-val", "NLMON", "y",
"--set-val", "BT", "m",
"--set-val", "BT_BCM", "m",
"--set-val", "BT_HCIUART", "m",
"--set-val", "BT_HCIUART_BCM", "y",
}
if err := dockerRun(args...); err != nil {
return err
}
if err := dockerRun("make", "olddefconfig"); err != nil {
return err return err
} }
// compile kernel and dtbs // compile kernel and dtbs
if err := dockerRun("make", "zImage", "dtbs", "-j"+strconv.Itoa(runtime.NumCPU())); err != nil { if err := dockerRun("make", "zImage", "dtbs", "modules", "-j"+strconv.Itoa(runtime.NumCPU())); err != nil {
return err return err
} }
if err := chown("arch/arm/boot"); err != nil { if err := chown("arch/arm/boot"); err != nil {
@ -101,6 +123,18 @@ func run() error {
return err return err
} }
// compile and move modules to dist
if err := dockerRun("make", "INSTALL_MOD_PATH=modules_out", "modules_install", "-j"+strconv.Itoa(runtime.NumCPU())); err != nil {
return err
}
if err := chown("modules_out"); err != nil {
return err
}
err = os.Rename(filepath.Join(kernelFolder, "modules_out/lib"), path.Join(dstFolder, "lib"))
if err != nil {
return err
}
// copy dtb files // copy dtb files
files, err := filepath.Glob(filepath.Join(bootFolder, "dts", "bcm*-rpi-*.dtb")) files, err := filepath.Glob(filepath.Join(bootFolder, "dts", "bcm*-rpi-*.dtb"))
if err != nil { if err != nil {
@ -124,53 +158,3 @@ func run() error {
return nil return nil
} }
func adjustTextFile(path string, skipLine func(string) bool, appendLines []string) error {
b, stat, err := readFile(path) // read the whole file in memory, since we are going to overwrite it
if err != nil {
return err
}
dst, err := os.OpenFile(path, os.O_TRUNC|os.O_WRONLY, stat.Mode())
if err != nil {
return err
}
defer dst.Close()
w := bufio.NewWriter(dst)
for _, line := range strings.Split(string(b), "\n") {
if skipLine(line) {
continue
}
_, err = w.WriteString(line + "\n")
if err != nil {
return err
}
}
for _, line := range appendLines {
_, err = w.WriteString(line + "\n")
if err != nil {
return err
}
}
err = w.Flush()
if err != nil {
return err
}
return dst.Close()
}
func readFile(path string) ([]byte, fs.FileInfo, error) {
f, err := os.Open(path)
if err != nil {
return nil, nil, err
}
defer f.Close()
b, err := io.ReadAll(f)
if err != nil {
return b, nil, err
}
stats, err := f.Stat()
return b, stats, err
}