/*
 * File:         Documentation/blackfin/Filesystems
 * Based on:
 * Author:
 *
 * Created:
 * Description:  This file contains the simple DMA Implementation for Blackfin
 *
 * Rev:          $Id: Filesystems 2384 2006-11-01 04:12:43Z magicyang $
 *
 * Modified:
 *               Copyright 2004-2006 Analog Devices Inc.
 *
 * Bugs:         Enter bugs at http://blackfin.uclinux.org/
 *
 */

		How to mount the root file system in uClinux/Blackfin
		-----------------------------------------------------

1	Mounting EXT3 File system.
	------------------------

	Creating an EXT3 File system for uClinux/Blackfin:


Please follow the steps to form the EXT3 File system and mount the same as root
file system.

a	Make an ext3 file system as large as you want the final root file
	system.

		mkfs.ext3  /dev/ram0 <your-rootfs-size-in-1k-blocks>

b	Mount this Empty file system on a free directory as:

		mount -t ext3 /dev/ram0  ./test
			where ./test is the empty directory.

c	Copy your root fs directory that you have so carefully made over.

		cp -af  /tmp/my_final_rootfs_files/* ./test

		(For ex: cp -af uClinux-dist/romfs/* ./test)

d	If you have done everything right till now you should be able to see
	the required "root" dir's (that's etc, root, bin, lib, sbin...)

e	Now unmount the file system

		umount  ./test

f	Create the root file system image.

		dd if=/dev/ram0 bs=1k count=<your-rootfs-size-in-1k-blocks> \
		> ext3fs.img


Now you have to tell the kernel that will be mounting this file system as
rootfs.
So do a make menuconfig under kernel and select the Ext3 journaling file system
support under File system --> submenu.


2.	Mounting EXT2 File system.
	-------------------------

By default the ext2 file system image will be created if you invoke make from
the top uClinux-dist directory.


3.	Mounting CRAMFS File System
	----------------------------

To create a CRAMFS file system image execute the command

	mkfs.cramfs ./test cramfs.img

	where ./test is the target directory.


4.	Mounting ROMFS File System
	--------------------------

To create a ROMFS file system image execute the command

	genromfs -v -V "ROMdisk" -f romfs.img -d ./test

	where ./test is the target directory


5.	Mounting the JFFS2 Filesystem
	-----------------------------

To create a compressed JFFS filesystem (JFFS2), please execute the command

	mkfs.jffs2 -d ./test -o jffs2.img

	where ./test is the target directory.

However, please make sure the following is in your kernel config.

/*
 * RAM/ROM/Flash chip drivers
 */
#define CONFIG_MTD_CFI 1
#define CONFIG_MTD_ROM 1
/*
 * Mapping drivers for chip access
 */
#define CONFIG_MTD_COMPLEX_MAPPINGS 1
#define CONFIG_MTD_BF533 1
#undef CONFIG_MTD_UCLINUX

Through the u-boot boot loader, use the jffs2.img in the corresponding
partition made in linux-2.6.x/drivers/mtd/maps/bf533_flash.c.

NOTE - 	Currently the Flash driver is available only for EZKIT. Watch out for a
	STAMP driver soon.


6. 	Mounting the NFS File system
	-----------------------------

	For mounting the NFS please do the following in the kernel config.

	In Networking Support --> Networking options --> TCP/IP networking -->
		IP: kernel level autoconfiguration

	Enable BOOTP Support.

	In Kernel hacking --> Compiled-in kernel boot parameter add the following

		root=/dev/nfs rw ip=bootp

	In File system --> Network File system, Enable

		NFS file system support --> NFSv3 client support
		Root File system on NFS

	in uClibc menuconfig, do the following
	In Networking Support
		enable Remote Procedure Call (RPC) support
			Full RPC Support

	On the Host side, ensure that /etc/dhcpd.conf looks something like this

		ddns-update-style ad-hoc;
		allow bootp;
		subnet 10.100.4.0 netmask 255.255.255.0 {
		default-lease-time 122209600;
		max-lease-time 31557600;
		group {
			host bf533 {
				hardware ethernet 00:CF:52:49:C3:01;
				fixed-address 10.100.4.50;
				option root-path "/home/nfsmount";
			}
		}

	ensure that /etc/exports looks something like this
		/home/nfsmount *(rw,no_root_squash,no_all_squash)

	 run the following commands as root (may differ depending on your
	 distribution) :
		-  service nfs start
		-  service portmap start
		-  service dhcpd start
		-  /usr/sbin/exportfs
