initial support for ubifs

This commit is contained in:
Daniel Barlow 2023-10-16 19:55:17 +01:00
parent 0693cf23d8
commit 629914f65e
5 changed files with 71 additions and 8 deletions

View file

@ -102,10 +102,7 @@
MTD_SPI_NOR= "y"; MTD_SPI_NOR= "y";
MTD_SPLIT_FIRMWARE= "y"; MTD_SPLIT_FIRMWARE= "y";
MTD_SPLIT_FIT_FW= "y"; MTD_SPLIT_FIT_FW= "y";
MTD_UBI="y";
MTD_UBI_BEB_LIMIT="20";
MTD_UBI_BLOCK="y";
MTD_UBI_WL_THRESHOLD="4096";
MMC = "y"; MMC = "y";
MMC_BLOCK = "y"; MMC_BLOCK = "y";
@ -158,6 +155,12 @@
klibBuild = config.system.outputs.kernel.modulesupport; klibBuild = config.system.outputs.kernel.modulesupport;
}; };
in { in {
ubi = {
minIOSize = "2048";
eraseBlockSize = "126976";
maxLEBcount = "1024"; # guessing
};
defaultOutput = "flashimage"; defaultOutput = "flashimage";
# the kernel expects this to be on a 2MB boundary. U-Boot # the kernel expects this to be on a 2MB boundary. U-Boot
# (I don't know why) has a default of 0x41080000, which isn't. # (I don't know why) has a default of 0x41080000, which isn't.
@ -166,7 +169,7 @@
# RAM unless the kernel is able to reuse it later. Oh well # RAM unless the kernel is able to reuse it later. Oh well
loadAddress = "0x42000000"; loadAddress = "0x42000000";
entryPoint = "0x42000000"; entryPoint = "0x42000000";
rootDevice = "/dev/mtdblock0"; rootDevice = "ubi0:liminix";
dts = { dts = {
src = "${openwrt.src}/target/linux/mediatek/dts/mt7622-linksys-e8450-ubi.dts"; src = "${openwrt.src}/target/linux/mediatek/dts/mt7622-linksys-e8450-ubi.dts";
includes = [ includes = [
@ -175,7 +178,7 @@
]; ];
}; };
flash.eraseBlockSize = "65536"; # c.f. pkgs/mips-vm/mips-vm.sh flash.eraseBlockSize = "65536"; # this is probably wrong
networkInterfaces = networkInterfaces =
let let
inherit (config.system.service.network) link; inherit (config.system.service.network) link;

View file

@ -39,7 +39,7 @@ in {
}; };
rootfsType = mkOption { rootfsType = mkOption {
default = "squashfs"; default = "squashfs";
type = types.enum ["squashfs" "jffs2"]; type = types.enum ["squashfs" "jffs2" "ubifs"];
}; };
boot = { boot = {
commandLine = mkOption { commandLine = mkOption {

View file

@ -7,5 +7,6 @@
./kexecboot.nix ./kexecboot.nix
./flashimage.nix ./flashimage.nix
./jffs2.nix ./jffs2.nix
./ubifs.nix
]; ];
} }

59
modules/ubifs.nix Normal file
View file

@ -0,0 +1,59 @@
{
config
, pkgs
, lib
, ...
}:
let
inherit (lib) mkIf mkOption types;
in
{
imports = [
./initramfs.nix
];
options.system.outputs = {
systemConfiguration = mkOption {
type = types.package;
description = ''
pkgs.systemconfig for the configured filesystem,
contains 'activate' and 'init' commands
'';
internal = true;
};
};
options.hardware.ubi = {
minIOSize = mkOption { type = types.str; };
eraseBlockSize = mkOption { type = types.str; }; # LEB
maxLEBcount = mkOption { type = types.str; }; # LEB
};
config = mkIf (config.rootfsType == "ubifs") {
kernel.config = {
MTD_UBI="y";
UBIFS_FS = "y";
UBIFS_FS_SECURITY = "n";
};
boot.initramfs.enable = true;
system.outputs = rec {
systemConfiguration =
pkgs.systemconfig config.filesystem.contents;
rootfs =
let
inherit (pkgs.pkgsBuildBuild) runCommand mtdutils;
cfg = config.hardware.ubi;
in runCommand "mkfs.ubifs" {
depsBuildBuild = [ mtdutils ];
} ''
mkdir -p $TMPDIR/empty/nix/store/ $TMPDIR/empty/secrets
cp ${systemConfiguration}/bin/activate $TMPDIR/empty/activate
ln -s ${pkgs.s6-init-bin}/bin/init $TMPDIR/empty/init
mkdir -p $TMPDIR/empty/nix/store
for path in $(cat ${systemConfiguration}/etc/nix-store-paths) ; do
(cd $TMPDIR/empty && cp -a $path .$path)
done
mkfs.ubifs -x favor_lzo -c ${cfg.maxLEBcount} -m ${cfg.minIOSize} -e ${cfg.eraseBlockSize} -y -r $TMPDIR/empty --output $out --squash-uids -o $out
'';
};
};
}

View file

@ -68,7 +68,7 @@ in attrset:
src = ./.; src = ./.;
CFLAGS = "-Os"; CFLAGS = "-Os";
LDFLAGS = "-static"; LDFLAGS = "-static -Xlinker -static";
postConfigure = '' postConfigure = ''
cp ${makedevs} makedevs.c cp ${makedevs} makedevs.c