diff options
author | Ludovic Courtès <ludo@gnu.org> | 2010-10-04 22:23:57 +0000 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2010-10-04 22:23:57 +0000 |
commit | bcba3664d9b57bb15cc27928236e445b0b83846e (patch) | |
tree | 202fd0d5d417291c14a7b4da223ad2793d9e02c8 /pkgs/misc/uboot | |
parent | 05b8ee73c4b08084899ed14d81533b7e17454462 (diff) | |
download | nixlib-bcba3664d9b57bb15cc27928236e445b0b83846e.tar nixlib-bcba3664d9b57bb15cc27928236e445b0b83846e.tar.gz nixlib-bcba3664d9b57bb15cc27928236e445b0b83846e.tar.bz2 nixlib-bcba3664d9b57bb15cc27928236e445b0b83846e.tar.lz nixlib-bcba3664d9b57bb15cc27928236e445b0b83846e.tar.xz nixlib-bcba3664d9b57bb15cc27928236e445b0b83846e.tar.zst nixlib-bcba3664d9b57bb15cc27928236e445b0b83846e.zip |
Add U-Boot for the GuruPlug.
svn path=/nixpkgs/trunk/; revision=24060
Diffstat (limited to 'pkgs/misc/uboot')
-rw-r--r-- | pkgs/misc/uboot/guruplug-file-systems.patch | 34 | ||||
-rw-r--r-- | pkgs/misc/uboot/guruplug-usb-msd-multi-lun.patch | 106 | ||||
-rw-r--r-- | pkgs/misc/uboot/guruplug.nix | 54 |
3 files changed, 194 insertions, 0 deletions
diff --git a/pkgs/misc/uboot/guruplug-file-systems.patch b/pkgs/misc/uboot/guruplug-file-systems.patch new file mode 100644 index 000000000000..76734456c2fb --- /dev/null +++ b/pkgs/misc/uboot/guruplug-file-systems.patch @@ -0,0 +1,34 @@ +Add support for the various file systems as found in `sheevaplug.h'. +In addition, increase the malloc area size to allow compilation of UbiFS. + +--- u-boot/include/configs/guruplug.h 1970-01-01 01:00:01.000000000 +0100 ++++ u-boot/include/configs/guruplug.h 2010-09-29 18:59:52.000000000 +0200 +@@ -145,7 +145,7 @@ + /* + * Size of malloc() pool + */ +-#define CONFIG_SYS_MALLOC_LEN (1024 * 128) /* 128kB for malloc() */ ++#define CONFIG_SYS_MALLOC_LEN (1024 * 1024) /* 1 MiB for malloc() */ + /* size in bytes reserved for initial data */ + #define CONFIG_SYS_GBL_DATA_SIZE 128 + +@@ -195,4 +195,18 @@ + + #define CONFIG_SYS_ALT_MEMTEST + ++/* ++ * File system ++ */ ++#define CONFIG_CMD_EXT2 ++#define CONFIG_CMD_FAT ++#define CONFIG_CMD_JFFS2 ++#define CONFIG_CMD_UBI ++#define CONFIG_CMD_UBIFS ++#define CONFIG_RBTREE ++#define CONFIG_MTD_DEVICE /* needed for mtdparts commands */ ++#define CONFIG_MTD_PARTITIONS ++#define CONFIG_CMD_MTDPARTS ++#define CONFIG_LZO ++ + #endif /* _CONFIG_GURUPLUG_H */ + diff --git a/pkgs/misc/uboot/guruplug-usb-msd-multi-lun.patch b/pkgs/misc/uboot/guruplug-usb-msd-multi-lun.patch new file mode 100644 index 000000000000..4f32dd89031f --- /dev/null +++ b/pkgs/misc/uboot/guruplug-usb-msd-multi-lun.patch @@ -0,0 +1,106 @@ +The GuruPlug's microSD card reader is a USB mass storage device that +has two logical units (LUNs), i.e., two "SCSI disks". This patch +adds multi-LUN support to the USB MSD driver. + +See the thread at <http://thread.gmane.org/gmane.comp.boot-loaders.u-boot/85425>. + +--- u-boot/common/usb_storage.c 1970-01-01 01:00:01.000000000 +0100 ++++ u-boot/common/usb_storage.c 2010-10-02 00:38:15.000000000 +0200 +@@ -204,6 +204,22 @@ int usb_stor_info(void) + return 1; + } + ++static unsigned int usb_get_max_lun(struct us_data *us) ++{ ++ int len; ++ unsigned char result; ++ len = usb_control_msg(us->pusb_dev, ++ usb_rcvctrlpipe(us->pusb_dev, 0), ++ US_BBB_GET_MAX_LUN, ++ USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_IN, ++ 0, us->ifnum, ++ &result, sizeof(result), ++ USB_CNTL_TIMEOUT * 5); ++ USB_STOR_PRINTF("Get Max LUN -> len = %i, result = %i\n", ++ len, (int) result); ++ return (len > 0) ? result : 0; ++} ++ + /******************************************************************************* + * scan the usb and reports device info + * to the user if mode = 1 +@@ -241,13 +257,21 @@ int usb_stor_scan(int mode) + break; /* no more devices avaiable */ + + if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) { +- /* ok, it is a storage devices +- * get info and fill it in +- */ +- if (usb_stor_get_info(dev, &usb_stor[usb_max_devs], +- &usb_dev_desc[usb_max_devs]) == 1) ++ /* OK, it's a storage device. Iterate over its LUNs ++ * and populate `usb_dev_desc'. */ ++ int lun, max_lun, start = usb_max_devs; ++ ++ max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]); ++ for (lun = 0; ++ lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV; ++ lun++) { ++ usb_dev_desc[usb_max_devs].lun = lun; ++ if (usb_stor_get_info(dev, &usb_stor[start], ++ &usb_dev_desc[usb_max_devs]) == 1) { + usb_max_devs++; + } ++ } ++ } + /* if storage device */ + if (usb_max_devs == USB_MAX_STOR_DEV) { + printf("max USB Storage Device reached: %d stopping\n", +@@ -882,6 +906,7 @@ static int usb_inquiry(ccb *srb, struct + do { + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_INQUIRY; ++ srb->cmd[1] = srb->lun << 5; + srb->cmd[4] = 36; + srb->datalen = 36; + srb->cmdlen = 12; +@@ -905,6 +930,7 @@ static int usb_request_sense(ccb *srb, s + ptr = (char *)srb->pdata; + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_REQ_SENSE; ++ srb->cmd[1] = srb->lun << 5; + srb->cmd[4] = 18; + srb->datalen = 18; + srb->pdata = &srb->sense_buf[0]; +@@ -924,6 +950,7 @@ static int usb_test_unit_ready(ccb *srb, + do { + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_TST_U_RDY; ++ srb->cmd[1] = srb->lun << 5; + srb->datalen = 0; + srb->cmdlen = 12; + if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD) +@@ -943,6 +970,7 @@ static int usb_read_capacity(ccb *srb, s + do { + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_RD_CAPAC; ++ srb->cmd[1] = srb->lun << 5; + srb->datalen = 8; + srb->cmdlen = 12; + if (ss->transport(srb, ss) == USB_STOR_TRANSPORT_GOOD) +@@ -957,6 +985,7 @@ static int usb_read_10(ccb *srb, struct + { + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_READ10; ++ srb->cmd[1] = srb->lun << 5; + srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff; + srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff; + srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff; +@@ -973,6 +1002,7 @@ static int usb_write_10(ccb *srb, struct + { + memset(&srb->cmd[0], 0, 12); + srb->cmd[0] = SCSI_WRITE10; ++ srb->cmd[1] = srb->lun << 5; + srb->cmd[2] = ((unsigned char) (start >> 24)) & 0xff; + srb->cmd[3] = ((unsigned char) (start >> 16)) & 0xff; + srb->cmd[4] = ((unsigned char) (start >> 8)) & 0xff; diff --git a/pkgs/misc/uboot/guruplug.nix b/pkgs/misc/uboot/guruplug.nix new file mode 100644 index 000000000000..f8048bbe0f4e --- /dev/null +++ b/pkgs/misc/uboot/guruplug.nix @@ -0,0 +1,54 @@ +{stdenv, fetchgit, unzip}: + +# Marvell's branch of U-Boot for the GuruPlug. + +let + # Aug 2010 revision of the `testing' branch of Marvell's U-Boot repository. + # See + # <http://www.openplug.org/plugwiki/index.php/Re-building_the_kernel_and_U-Boot> + # for details. + rev = "f106056095049c2c748c2a2797e5353295240e04"; +in +stdenv.mkDerivation { + name = "uboot-guruplug-0.0pre${rev}"; + + src = fetchgit { + url = "git://git.denx.de/u-boot-marvell.git"; + sha256 = "18gwyj16vml7aja9cyan51jwfcysy4cs062z7wmgdc0l9bha6iw7"; + inherit rev; + }; + + patches = + [ ./guruplug-file-systems.patch ./guruplug-usb-msd-multi-lun.patch ]; + + enableParallelBuilding = true; + + # Remove the cross compiler prefix. + configurePhase = '' + make mrproper + make guruplug_config + sed -i /CROSS_COMPILE/d include/config.mk + ''; + + buildPhase = '' + unset src + if test -z "$crossConfig"; then + make all u-boot.kwb + else + make all u-boot.kwb ARCH=arm CROSS_COMPILE=$crossConfig- + fi + ''; + + buildNativeInputs = [ unzip ]; + + dontStrip = true; + NIX_STRIP_DEBUG = false; + + installPhase = '' + ensureDir $out + cp -v u-boot u-boot.{kwb,map} $out + + ensureDir $out/bin + cp tools/{envcrc,mkimage} $out/bin + ''; +} |