UM0477 User Manual
SPEAr Plus Linux SDK, embedded root filesystem
Introduction
This document provides information about the root filesystem for embedded applications provided with the SPEAr Plus Linux SDK, ver 1.1. The root filesystem provides the main Linux file structure accessible to user space, in practice the application view of the Linux software environment.
September 2008
Rev 2
1/37
www.st.com
Contents
UM0477
Contents
1 2 Reference documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1 Acronyms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3
The default root filesystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.1 3.2 3.3 3.4 3.5 Versioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Star tup files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 System commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 System libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Default initial processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4
Device access . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.1 4.2 4.3 4.4 4.5 4.6 Device nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Mounting point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 RAM disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Flash disk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Proc pseudo filesystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 USB pseudo filesystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5 6 7
Basic file transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Customizing the root filesystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 U-Boot settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Appendix A Default runtime contents. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Appendix B System commands reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Appendix C Quick operation guide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 8 Revision history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2/37
UM0477
List of tables
List of tables
Table 1. Table 2. Table 3. Table 4. Table 5. Table 6. Table 7. Table 8. Table 9. Acronyms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Default commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Set of core library files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Default initial processes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Set of devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Runtime paths. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Environment variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Frequently used commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Document revision history . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3/37
Reference documentation
UM0477
1
Reference documentation
1. 2. 3. 4. 5. 6. 7. 8. 9. STMicroelectronics, SPEAr Plus Linux SDK, getting started, SW ver. 1.1 STMicroelectronics, SPEAr Plus Linux SDK, kernel and device APIs, SW ver. 1.1 STMicroelectronics, SPEAr Plus Linux SDK, embedded root filesystem, SW ver. 1.1 STMicroelectronics, SPEAr Plus Development Board, user manual STMicroelectronics, SPEAr Head600 Datasheet, http://www.st.com STMicroelectronics, SPEAr Plus600 Datasheet, http://www.st.com BusyBox, http://www.busybox.net Free Software Foundation, The GNU C Library Reference Manual, Edition 0.11, December 2006, Ver 2.6, http://www.gnu.org/software/libc/manual/ Denx Software Engineering, ELDK 4.1, http://www.denx.de
10. O'Reilly, Understanding the Linux kernel, 3rd Edition, 2006
4/37
UM0477
Introduction
2
Introduction
This document provides information about the root filesystem for embedded applications provided with the SPEAr Plus Linux SDK (referred as just "SDK" in the following). The root filesystem provides the main Linux file structure accessible to user space, in practice the application view of the Linux software environment. Alternative ways are available to use the root filesystem, depending on specific purposes. For stand-alone operation, the development board needs a root filesystem stored on NOR Flash. During development stages, a base root filesystem may be flashed as well or it may be remotely mounted at each reset from a host PC (by NFS protocol). Custom applications and modules may be also tested by uploading them to a RAM file system using TFTP or XMODEM protocol. In all cases, files on the root filesystem will be actually loaded on demand to system RAM through the Linux paging mechanism. When using the Flash-resident option, the root filesystem is intended to be formatted according to a flash filesystem like JFFS2 or CRAMFS. On the other side, when stored on a host PC and mounted through NFS, the root file system has no potential limitations in terms of writing access and maximum size. However, after development, the defined contents will have to fit in the available flash anyway. Therefore, it is recommended to keep the contents of networked root filesystem and the corresponding flash binary image aligned, in order to anticipate potential risks of flash space overflow. Another general consideration about the SDK-provided root filesystem is that the selected Linux configuration is single-user (a "root" user is assumed) with no login authentication, as typically expected by embedded applications. A default root filesystem is provided with this SDK. Such default filesystem does not contain any specific user applications and it is very small (less than 400 KB when stored in compressed form on NOR Flash), while including all base system commands and libraries. The default root filesystem is intended as a starting point for end users to be extended with custom application-dependent files. In next sections, the structure and contents of the default root filesystem are first described. Then, the procedures to customize and operate with the root filesystem according to the various available approaches are discussed. Interactive commands are shown in courier bold font. The "#" prompt is assumed for the Linux shell on the target board. The "$" prompt is assumed for the Linux shell on the PC host. The "spearplus>" prompt is assumed for interaction with the resident monitor (U-Boot). Finally, in this entire document, it is assumed that the SDK 1.1 package has been installed on a Linux PC host under path: /opt/splus_linux_sdk_1_1/
5/37
Introduction
UM0477
2.1
Acronyms
Table 1. Acronyms
Explanation Application programming interface Address resolution protocol Compressed ROM file system Cyclic redundancy check Direct memory access Enhanced host controller interface Embedded linux development kit File allocation table General purpose I/O General public license (GNU) Hardware abstraction layer Hardware Inter-integrated circuit bus Internet protocol Inter-process communication Interrupt service routine Local area network Media access control Memory technology device Network file system Open host controller interface Operating system Random access memory Real-time clock Real time operating system Software development kit System on chip Structured processor enhanced architecture Software Trivial file transfer protocol Universal asynchronous receiver-transmitter Universal serial bus Acronym API ARP CRAMFS CRC DMA EHCI ELDK FAT GPIO GPL HAL HW I2C IP IPC ISR LAN MAC MTD NFS OHCI OS RAM RTC RTOS SDK SoC SPEAr SW TFTP UART USB
6/37
UM0477 Table 1. Acronyms (continued)
Explanation Vectored interrupt controller Watchdog timer
Introduction
Acronym VIC WDT
7/37
The default root filesystem
UM0477
3
The default root filesystem
A full listing of the runtime contents in the default root filesystem is reported in Appendix A of this document. In the following, all the main elements are discussed in details.
3.1
Versioning
Each specific version of the root filesystem provided with SDKs is clearly identified by means of a text file located under path /etc/rootfs.info. This file contains a single text line with the following format: .. For instance, a root filesystem revision A for SDK 1.1 is identified by the string: 1.1.A In order to check the current version running on a board, just issue the following command from the shell: # cat /etc/rootfs.info
3.2
Startup files
Initialization is concerned with actions and settings defining the initial behavior of userspace software after kernel bootstrap. The initialization is configured by files located under standard /etc path. The first user-space process launched by the kernel is called "init" and is provided by BusyBox [7]. The "init" process is configured through the /etc/inittab file. The contents for such file are as follows: ::sysinit:/etc/rc ttyS0::respawn:-/bin/ash The first line defines the shell script that is automatically invoked to initialize the system, in this case /etc/rc. The second line defines the serial port (ttyS0, i.e. UART 0) and the shell to be used as Linux console, in this case /bin/ash (a bash subset). The default contents of /etc/rc script are the following: #! /bin/ash /bin/mount -t proc proc /proc /bin/mount -t sysfs sysfs /sys /bin/mount -t usbfs usbfs /proc/bus/usb /bin/mount -t tmpfs dev /dev /bin/mount -t tmpfs tmpfs /mnt /bin/echo /bin/mdev > /proc/sys/kernel/hotplug /bin/mdev -s /bin/mknod /dev/wdt c 250 0 /bin/mknod /dev/gpio c 251 0 /bin/mknod /dev/i2c c 240 0
8/37
UM0477
The default root filesystem Such two files should not be changed. Instead, in case additional commands for custom purposes are required, they should be put in the /etc/profile script (automatically run by the initial shell) that by default has the following contents: #! /bin/ash export PATH=/bin:/usr/bin export SHELL=/bin/ash /bin/mount -t tmpfs -o size=2M tmpfs /tmp Such script mounts the RAM-based temporary filesystem, supporting file read/write operations (default size is set to 2MB), and sets default values for the PATH and SHELL environment variables. See Section 6 of this document for the customization procedure. A new configuration file (mdev.conf) has beeen added in SDK 1.1. This file is needed for auto mount support in file system. Its contents are as follows: sd[a-z][0-9]* 0:3 660
3.3
System commands
System commands are basic utilities mainly provided to support the development and debugging stages. They are all stored under standard /bin path. They are not strictly needed in a final product, while their size is small enough that they be usually kept in production devices without a significant penalty. The SDK exploits BusyBox, an open source program combining tiny versions of many common user-space Linux utilities into a single small executable. This approach makes BusyBox particularly suitable for Linux-based embedded systems since minimized footprint is an important factor. Since BusyBox has been developed with size-optimization and limited resources in mind, the available commands have typically fewer options than their full-featured GNU counterparts. However, most important options are still available enabling to satisfy all requirements of developing and testing embedded products. For SDK 1.1, BusyBox version 1.10.2 has been selected. The SDK provides a default configuration of BusyBox, where a specific command subset has been pre-selected by ST for minimal footprint while preserving the typical functionality expected by SPEAr-based products. The default command set supported by SDK 1.1 is described in Table 2. Table 2. Default commands
Description Shell (bash subset) Concatenate and print file(s) Change permission flags for file(s) Calculates the CRC32 checksum of file(s) Clear console screen Copy file Display current date and time Repor t storage space usage
Command ash cat chmod cksum clear cp date du
9/37
The default root filesystem Table 2. Default commands (continued)
Description Print to standard output Display current environment Search for file(s) in a directory hierarchy Get or set real-time clock (RTC) Configure network interface Load a kernel extension module Remove IPC resources Display status of IPC resources Send signal(s) to process(es) Send signal(s) to process(es) by name Create soft link List directory contents List currently loaded kernel modules Add logical devices Create directory(ies) Create special file Display filter Mount a filesystem Move or rename file(s) Display networking information Client for PING protocol Display status of current processes Print name of working directory Remove file(s) or directory(ies) Unload a kernel module Edit IP routing tables Receive file by XMODEM protocol over UART 0 Flush filesystem buffers Telnet protocol client Check file types and compare values TFTP client Unmount a filesystem Delay with microsecond resolution
UM0477
Command echo env find hwclock ifconfig insmod ipcrm ipcs kill killall ln ls lsmod mdev mkdir mknod more mount mv netstat ping ps pwd rm rmmod route rx sync telnet test tftp umount usleep
In addition, the following commands (most of them mainly useful to write shell scripts) are also available as built-in in the shell interpreter:
10/37
UM0477
The default root filesystem alias, bg, break, cd, chdir, command, continue, eval, exec, exit, export, false, fg, hash, help, jobs, let, local, read, readonly, return, set, shift, source, times, trap, true, type, ulimit, umask, unalias, unset, wait
Note:
the init link and busybox executable are also found under /bin, but they are not intended to be directly invoked as commands by the end user. A quick reference of commands usage is reported in Appendix B of this document. When using the command set above, the following considerations have also to be taken into account:
commands writing to files and directories (e.g. chmod,cp,ln,mkdir,mv,rm) can not be used with elements in the flashed root filesystem since it is read-only; they are mostly intended to write to the temporary RAM filesystem (tmpfs) or to USB mass storage devices plugged into the development board commands related to networking (e.g. ifconfig,netstat,ping,tftp) obviously assume that an Ethernet link is available and the network stack has been initialized and configured
3.4
System libraries
System libraries are runtime shared libraries that are application-independent. They are stored under standard /lib path. The default root filesystem is based on the standard GLIBC library set, as provided by the ELDK 4.1 toolchain. The following set of core library files is included in the default root filesystem: Table 3. Set of core library files
Library libc-2.3.5.so ld-2.3.5.so libm-2.3.5.so libpthread-0.10.so libcrypt-2.3.5.so Main C library Shared libraries loader Math library Posix threads library Encryption library Description
Note:
additional entries in the /lib directory are pre-created as soft links to shared libraries above. An empty directory named /lib/modules is also predefined. Such directory is reserved for application-independent kernel extension modules that could be provided by ST inside SDKs. Please note also that the math library (libm) and the Posix thread library (libpthread) are not strictly required in all applications.
11/37
The default root filesystem
UM0477
3.5
Default initial processes
It may be useful to understand the list of active processes reported by the `ps' command when using the default pre-flashed software just after Linux initialization: Table 4. Default initial processes
Type User process Kernel thread Kernel thread User process The initial shell Asynchronous I/O kernel support. Manages the pre-defined general-purpose kernel work queue. The first task (PID 1) spawned by the kernel, just after the idle task. It becomes a user process performing user-space initialization. Manages the specific kernel work queue for periodic activation of block device drivers. Used for making calls out to user-space applications from within the kernel. Monitors USB hubs and configures USB devices when they are hot-plugged into the system Manages specific work queue for MMC card support. Manages deferred functions (soft interrupts and tasklets) in case of high interrupt load. Manages a specific kernel work queue for USB support. Manages memory page reclaiming. Manage the workqueue of the helper thread. Used by MTD subsystem (flash memory access layer). Two or more thread instances managing dirty buffers flushing for the page cache associated with block devices. Manage software watchdog. Description
Process /bin/ash aio/0 events/0 init
kblockd/0 khelper khubd kmmcd ksoftirqd/0 ksuspend_usbd kswapd0 kthread mtdblockd pdflush watchdog/0
Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread Kernel thread
Since there are no specific applications running with default software, most processes are kernel threads. These are tasks created from kernel-space (by the kernel itself or by device drivers). Most of them do not normally consume CPU time being waiting to be scheduled on certain events. Note: depending on specific kernel configurations, the list of initial processes may be slightly different.
12/37
UM0477
Device access
4
4.1
Device access
Device nodes
Devices are accessed through special files in the virtual file system, located under standard /dev path. The set of devices available on SPEAr Plus evaluation boards and supported in SDK 1.1 is summarized in Table 5. Table 5.
Path /dev/console /dev/gpio /dev/i2c /dev/mtdblock4 /dev/null /dev/r tc /dev/sda /dev/sda1 /dev/sdb /dev/sdb1 /dev/sdc /dev/sdc1 /dev/sdd /dev/sdd1 /dev/ttyS0 /dev/tty /dev/ttyS1
Set of devices
Device Type char char char block char char block block block block char char Description Console, only for compatibility reasons. The actual console device is: /dev/ttyS0 (or equivalently/dev/tty) GPIO blocks I2C bus NOR Flash partition 4 (R/W persistent user data) Null device Real-time clock USB mass storage device 1 USB mass storage device 2 USB mass storage device 3 (may be needed when more than 2 devices are plugged through a USB hub) USB mass storage device 4 (may be needed when more than 2 devices are plugged through a USB hub) UART 0 UART 1
4.2
Mounting point
USB hot plugging detection is not fully supported yet. Therefore, after having plugged a mass storage device (formatted with usual Windows/DOS FAT filesystem) to a USB host port, a command like the following must be manually issued: # mount -t vfat /dev/sda1 /mnt/usb1 After this command, the contents of the USB storage device will be directly available as a tree under /mnt/usb1 root. Before unplugging the USB device, the following command must be issued: # umount /dev/sda1
13/37
Device access
UM0477
4.3
RAM disk
A RAM disk is a logical read/write file storage area implemented using part of system RAM. The standard /tmp node is predefined. This is intended to be used as the top of a dynamically mounted RAM-based file system (tmpfs is adopted) used for the storage of non-persistent files. See the initialization /etc/profile script for the command that automatically mounts tmpfs at boot time. By default, a 2MB "RAM disk" is created. In order to change the maximum size, see Section 6 of this document. Any attempt of writing data over the defined maximum size will generate an error like: write error: No space left on device This area is important since it may be used to store application-specific files during development and testing. Even in a final product, it may be used for any temporary file storage. Of course, its content is non-persistent and it is lost on board reset.
4.4
Flash disk
While the RAM disk may be used for files that are assumed to be lost on reset, a different mechanism is supported to manage data that must be preserved across system reboots. The typical use case is to maintain a "database" of product-specific data (e.g. a phone book for Fax devices) and settings (e.g. the default paper format for a printer). This mechanism is provided through the special device /dev/mtdblock4 that gives direct read/write access to a predefined 64 KB partition on the NOR Flash. In practice, /dev/mtdblock4 may be used as a single quite big binary file. Such file may be exploited in different ways according to specific applications.
14/37
UM0477
Device access As a simple usage example, a property string may be written from the shell by just executing a command like: # echo "print-mode:color" > /dev/mtdblock4 The contents may now be displayed with a command like: # cat /dev/mtdblock4 | more print-mode:color ... Note that, with the plain cat command, all the 64KB binary contents will be dumped to console. In real applications, access to the logical file /dev/mtdblock4 will be actually performed through standard file I/O library functions.
4.5
Proc pseudo filesystem
The standard /proc subtree is made available. The proc filesystem is a pseudo-filesystem that contains user-accessible entries that pertain to the runtime state of the kernel and, by extension, the executing processes that run on top of it. The "pseudo" term is used because the proc filesystem exists only as a reflection of the in-memory kernel data structures it displays. This is why most files and directories within /proc are zero bytes in size. In practice, the proc file system is intended to be populated at runtime with system information and statistics. Proc files may be either read-only or read-write. Each numerically named directory within /proc corresponds to the process ID (PID) of a process currently executing on the system. This part of the proc filesystem totally depends on the runtime state of the target. Each numeric entry contains subfiles that provide process-specific information. The other (non-numeric) entries describe some aspects of kernel operation. A few common user commands performed on the proc filesystem are as follows:
# # # # # # # # # # # # # # # # cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat /proc/version /proc/sys/kernel/osrelease /proc/sys/kernel/version /proc/cpuinfo /proc/meminfo /proc/modules /proc/mtd /proc/partitions /proc/stat /proc/bus/usb/devices /proc/net/dev /proc/net/tcp /proc/net/udp /proc/net/arp /proc/net/route /proc/kallsyms Display full Linux kernel version information Display Linux kernel release Display Linux kernel build date and time Display information about the SPEAr CPU Display information about memory usage Display information about kernel extension modules Display information about flash partitions Display other information about flash partitions Display OS status information Display information about USB Host ports Report Ethernet information. Report TCP sockets information. Report UDP sockets information. Report ARP table. Report IP routing table. List all kernel symbols
For more details about the functionality provided by the proc filesystem see [2] as well as standard Linux documentation.
15/37
Device access
UM0477
4.6
USB pseudo filesystem
The standard /proc/bus/usb subtree is also made available. This is used to access USB Host controllers and plugged devices from user-space applications. Further details are reported in [2] and also in standard Linux documentation.
16/37
UM0477
Basic file transfer
5
Basic file transfer
One simple approach to run custom application components for testing purposes is to use the flashed root filesystem and to upload only some new files to the target board using TFTP transfers. This approach has the following advantages:
simpler configuration of host PC can be used with both Linux and Windows hosts customization of the root file system is not required U-Boot reconfiguration is not required
On the other hand, a manual file transfer request is required for every update. Moreover, space on RAM filesystem is generally limited, while the 2MB default allocation may be increased if the overall target application allows it. Finally, during development, application files will not be stored under same paths as in final release (/tmp subtree rather than /usr subtree). A TFTP server must be running on the host PC. See [1] for the installation procedure. Files to be uploaded to the target board have just to be copied under selected TFTP server default path. The file transfer from host to target board is then performed by invoking the tftp command from the board's Linux shell. For instance, an executable file app located under TFTP server root may be uploaded ("get") to the RAM filesystem under /tmp on the evaluation board with the command: # tftp g r app -l /tmp/app 192.168.1.1 where 192.168.1.1 is the recommended (private) IP address for the Ethernet port on host PC used to connect to the target board. By using TFTP, files may be also transferred back ("put") from the SPEAr board to the host PC. For instance, a file named /tmp/log.txt on the board may be copied to the PC under TFTP server root with a command like: # tftp p -l /tmp/log.txt r log.txt 192.168.1.1 In case an Ethernet host-target link is not available, a slower while still effective alternative for file upload is available: a normal serial cable connection may be exploited through the XMODEM protocol provided by the built-in rx command. The UART0 port on the target board must be used. A terminal emulator needs to be first launched on the host PC (such as HyperTerminal for Windows or minicom for Linux). Then, to transfer a file like app to /tmp destination, the following command is executed from the board's shell: # rx /tmp/app This command waits until an XMODEM transfer is started on PC-side, and then it proceeds with the transfer. Differently from TFTP, the rx command only works for transfers from PC to the board and not for the reverse path.
17/37
Customizing the root filesystem
UM0477
6
Customizing the root filesystem
The SDK is intended as a starting point for user-specific customization. More specifically, customizing the root filesystem enables software developers to:
add custom executable programs, runtime libraries or kernel extension modules modify the default initialization phase modify / extend the default set of devices change BusyBox configuration
A flash memory update is required to use a custom flashed root filesystem or when a new version of the default root filesystem is delivered by ST. On the other hand, during development stages, very frequent changes occur to applicationspecific items such as custom executables, shared libraries, modules, data files. Therefore, a suitable procedure based on NFS is also made available to avoid a complete re-flashing of root filesystem for every change. However, access to the root filesystem through NFS may be slower than through the flashed CRAMFS due to network transfer overhead. For the installation of a NFS server on the PC host see [1]. On the host PC, the code subtree used to rebuild the root filesystem has the following structure (directories are shown here in square brackets): [opt] [splus_linux_sdk_1_1] build.sh [flash] rootfs.cram ... [rootfs] [bin] [dev] ... [src] [rootfs-1.1.A] busybox-1.10.2.tar mkrootfs.sh mkrootfs-custom.sh [configs] BusyboxConfig In order to rebuild the root filesystem (for both flash and NFS scenarios), the following command has to be executed having splus_linux_sdk_1_1 as working directory: # build.sh rootfs This command will internally execute the mkrootfs.sh and the mkrootfs-custom.sh predefined scripts. The outputs of this procedure are:
an updated rootfs.cram binary file on the Linux PC host under path: /opt/splus_linux_sdk_1_1/flash/rootfs.cram an updated expanded root filesystem under /opt/splus_linux_sdk_1_1/rootfs to be used in case of NFS mounting
18/37
UM0477
Customizing the root filesystem Note that, in the CRAMFS-based root filesystem case, the special file header standardized by U-Boot, must not be pre-pended. In case of customizations, the mkrootfs.sh must not be changed. Instead, custom commands have to be added, before rebuilding, to the mkrootfs-custom.sh script that will be invoked in such a way that the current directory is the top of the logical root filesystem under creation. The default contents of mkrootfs-custom.sh script are as follows: #! /bin/sh echo "export PATH=/bin:/usr/bin" >> etc/profile echo "export SHELL=/bin/ash" >> etc/profile echo "/bin/mount -t tmpfs -o size=2M tmpfs /tmp" >> etc/profile These commands operate by writing to the /etc/profile that is created automatically. The first line defines the ordered list path for searching executable programs. Users may specify additional application-specific paths here. The second line just sets the SHELL standard variable. This line should not be changed. The last line is used to mount the "RAM disk". Users may change the memory size here. Example: The following mkrootfs-custom.sh script changes the RAM disk to 4 MB, adds two custom executable programs, a custom shared library and a custom module to the default root filesystem: #! /bin/sh # unchanged echo "export PATH=/bin:/usr/bin" >> etc/profile echo "export SHELL=/bin/ash" >> etc/profile # change RAM disk to 4 MB in etc/profile echo "/bin/mount -t tmpfs -o size=4M tmpfs /tmp" >> etc/profile # add application-specific files cp /opt/custom/myprog1 usr/bin cp /opt/custom/myprog2 usr/bin cp /opt/custom/mylib.so usr/lib cp /opt/custom/mymodule.ko usr/lib/modules As shown in the example, it is recommended to use the following runtime paths for custom extensions of the root filesystem: Table 6. Runtime paths
Path /usr/bin /usr/lib /usr/lib/modules Custom executable programs Custom shared libraries Custom kernel extension modules Contents
If the BusyBox configuration needs to be changed, this task can be performed by editing the following file before rebuilding:
19/37
Customizing the root filesystem
UM0477
/opt/splus_linux_sdk_1_1/src/rootfs-1.1.A/configs/BusyboxConfig Detailed information about BusyBox configuration (as well as full source code) may be found inside the archive file: /opt/splus_linux_sdk_1_1/src/rootfs-1.1.A/busybox-1.10.2.tar
20/37
UM0477
U-Boot settings
7
U-Boot settings
SPEAr boards come with predefined settings for the U-Boot resident monitor already enabling to support different scenarios for working with a root filesystem. Such settings are based on the following environment variables: Table 7. Environment variables
Default value (single line string) bootm 0xf8050000 console=ttyS0 quiet mem=64M root=/dev/mtdblock3 setenv bootargs console=ttyS0 quiet mem=64M root=/dev/mtdblock3;saveenv setenv bootargs console=ttyS0 quiet mem=64M root=/dev/nfs nfsroot=192.168.1.1:/opt/splus_linux_sdk_1_1/rootfs;saveenv tftp 0x80 0 0 rootfs.cram;protect off 1:29-126;erase 1:29-126;cp.b 0x80 0 0 0xF830 0 0 ${filesize};protect on 1:29-126;cmp.b 0xF830 0 0 0x80 0 0 ${filesize} loadb 0x80 0 0;protect off 1:29-126;erase 1:29-126;cp.b 0x80 0 0 0xF830 0 0 ${filesize};protect on 1:29-126;cmp.b 0xF830 0 0 0x80 0 0 ${filesize}
Variable bootcmd bootargs fboot nboot
flash_root_eth
flash_root_uar t
All these variables must not be usually changed. To select system bootstrap with flashed root file system, just execute the following command before resetting the board: spearplus> run fboot To select system bootstrap with NFS-mounted root file system, just execute the following command before resetting the board: spearplus> run nboot The value of nboot variable may be changed in case a different host IP address and/or remote file system path are used. Expert users could also change default options for the nfsroot field value. See U-Boot documentation for more details. The flash_root_eth variable defines a script for reflashing the root filesystem over Ethernet using TFTP. The flash_root_uart variable defines a script for reflashing the root filesystem over a serial link using Kermit. Consult Appendix A of document [1] to fully restore default U-Boot settings in case of any damage to them.
21/37
Default runtime contents
UM0477
Appendix A
Default runtime contents
This section describes the runtime structure and contents selected by ST for the default root filesystem, specifically designed by taking into account the requirements of embedded systems. Directories are shown in square brackets. [bin] [ -> busybox [[ -> busybox ash -> busybox busybox cat -> busybox chmod -> busybox cksum -> busybox clear -> busybox cp -> busybox date -> busybox du -> busybox echo -> busybox env -> busybox find -> busybox hwclock -> busybox ifconfig -> busybox init -> busybox insmod -> busybox ipcrm -> busybox ipcs -> busybox kill -> busybox killall -> busybox ln -> busybox ls -> busybox lsmod -> busybox mdev -> busybox mkdir -> busybox mknod -> busybox more -> busybox mount -> busybox mv -> busybox netstat -> busybox ping -> busybox ps -> busybox pwd -> busybox rm -> busybox rmmod -> busybox route -> busybox rx -> busybox sync -> busybox telnet -> busybox test -> busybox tftp -> busybox umount -> busybox
22/37
UM0477
Default runtime contents usleep -> busybox [dev] console gpio i2c mtdblock4 null rtc sda sda1 sdb sdb1 sdc sdc1 sdd sdd1 tty -> ttyS0 ttyS0 ttyS1 [etc] inittab mdev.conf profile rc rootfs.info [lib] libc-2.3.5.so ld-2.3.5.so libm-2.3.5.so libpthread-0.10.so libcrypt-2.3.5.so ... [mnt] [proc] [tmp] [usr] [bin] [lib] [modules]
23/37
System commands reference
UM 0 4 7 7
Appendix B
System commands reference
This section provides a quick reference of supported system commands (executable from the Linux shell on the target board) and mostly useful options.
Name: Synopsys: Description:
a sh ash [FILE]... ash -c command [args]... The ash shell (command interpreter), actually a subset of classical bash. An initial shell is automatically launched at initialization time. Usually there is no need to explicitly run additional shells.
Name: Synopsys: Description: Examples:
c at cat [FILE]... Write the contents of one or more files to standard output. # cat /proc/uptime 29.38 0.02
Name: Synopsys: Description:
chmod chmod [OPTIONS] MODE[,MODE]... FILE... Change file attributes. Each MODE is one or more of the letters ugoa (letter "a" is mostly used, to indicate "all users"), one of the symbols +-= ("+" is used to turn on and "-" to turn off) and one or more of the letters rwxst (most common are "w"=write, r="read", x="execute"). -R Changes files and directories recursively
Options: Examples:
Set attributes for executable file /tmp/app: # chmod a+rwx /tmp/app Set attributes for non-executable file /tmp/mylib.so: # chmod a+rw-x /tmp/mylib.so Only applicable to writable filesystems such as /tmp subtree and USB mass storage devices, if mounted. Can not be used on elements of flashed root filesystem.
Remarks:
Name: Synopsys: Description:
cksum cksum FILES... Calculates the CRC32 checksums of specified FILES. The first printed field is the checksum, the second field is the file size and the third field is the filename.
24/37
UM0477 Examples:
System commands reference # cksum /lib/libuClibc-0.9.27.so 1651818952 310028 /lib/libuClibc-0.9.27.so
Name: Synopsys: Description:
clear clear Clear console screen.
Name: Synopsys: Description: Options:
cp cp [OPTIONS]... SOURCE DEST Copies SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY. -a -d -p -i -R Recursive, preserve all info. Same as -dpR Preserves links Preserves file attributes if possible Interactive, prompt before overwrite Copies directories recursively
Examples: Remarks:
Copy entire /bin subtree to /tmp: # cp -a /bin /tmp Destination must be on a read-write filesystem such as /tmp subtree and USB mass storage devices, if mounted. Can not be on flashed root filesystem.
Name: Synopsys: Description:
d ate date date MMDDhhmm[[CC]YY][.ss] Without argument, displays the current system date and time as maintained by Linux OS. With argument, changes the system time. System time is not preserved on board reset, unless the hwclock command is used as well in combination. # date 092416112007 Mon Sep 24 16:11:00 UTC 2007 # date Mon Sep 24 16:11:37 UTC 2007
Examples:
Name: Synopsys: Description:
du du [OPTIONS] [FILE]... Summarizes filesystem space used for each FILE and/or directory. Space is printed in KB units. Printed values are computed considering uncompressed file sizes. For flash-resident files, the size is actually about the half due to compression.
25/37
System commands reference Options: -a -c -s show sizes of files in addition to directories output a grand total display only a total for each argument
UM 0 4 7 7
Examples:
# du -c /bin /lib 192 /bin 1 /lib/modules 488 /lib 680 total
Name: Synopsys: Description: Options: Examples:
echo echo [OPTIONS] [ARG ...] Prints the specified ARGs to standard output. -n -e suppress trailing newline interpret backslash-escaped characters (i.e., \t=tab)
# echo -e "first\tsecond" first second
Name: Synopsys: Description:
env env [OPTIONS] [name=value]... [command] Without arguments, prints the current environment. With arguments (seldom used), runs a program after setting up the new specified environment as defined by name/value pairs and removing variables with u. -i -u start with an empty environment remove variable from the new environment
Options: Examples:
# env USER=root HOME=/ TERM=linux PATH=/bin:/usr/bin SHELL=/bin/ash PWD=/lib
Name: Synopsys: Description:
f ind find [PATH...] [EXPRESSION] Search for files in a directory hierarchy. The default PATH is the current directory. The most commonly used EXPRESSION is: -name PATTERN File name (leading directories removed) matches PATTERN # find /bin -name mk* /bin/mkdir /bin/mknod
Examples:
26/37
UM0477 Name: Synopsys: Description: hwclock hwclock hwclock -w
System commands reference
Without the -w option, displays the current RTC date and time as maintained by SPEAr and the backup battery. With w option, copies the current OS system date and time to the RTC. RTC date and time is preserved on board reset due to battery backup. # date 092416112007 Mon Sep 24 16:11:00 UTC 2007 # hwclock -w # hwclock Mon Sep 24 16:11:39 2007 0.0 0 00 seconds On current SPEAr Plus evaluation boards no battery is available. Therefore, the RTC is preserved only in case of reset but not in case of power off.
Examples:
Remarks:
Name: Synopsys: Description: Examples:
i fconfig ifconfig [] ifconfig [up|down] Manage configuration of a network interface. The SPEAr built-in Ethernet interface is named eth0. Display Ethernet configuration: # ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:11:22:33:44:55 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:16 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:56 Set Ethernet configuration (IP address): # ifconfig eth0 192.168.1.10 Disconnect Ethernet: # ifconfig eth0 down eth0: stop
Name: Synopsys: Description: Examples:
insmod insmod MODULE Loads the specified kernel modules into the kernel. # insmod mymodule.ko
27/37
System commands reference Name: Synopsys: Description: ipcrm ipcrm [-[MQS] key] ipcrm [-[mqs] id]
UM 0 4 7 7
Remove an IPC resource. The upper-case options MQS are used to remove an IPC resource by key. The lowercase options mqs are used to remove an IPC resource by numeric id. -m | -M -q | -Q -s | -S Remove a shared memory segment (after ast detach) Remove a message queue Remove a semaphore
Options:
Name: Synopsys: Description:
ipcs ipcs Repor t current status of IPC resources.
Name: Synopsys: Description: Options: Examples:
kill kill [-] process-id [process-id ...] Send a signal (default is SIGTERM) to the specified process(es). - Signal number to be sent.
Terminate a process with PID 34: # kill -9 34
Name: Synopsys: Description: Options:
killall killall [-q] [-l] [-] process-name [process-name ...] Send a signal (default is SIGTERM) to the process(es) specified by name. - Signal number to be sent. -l List all signal names and numbers -q Do not complain if no processes were killed # # # # usleep 50 0 000 & ps killall usleep ps
Examples:
Name: Synopsys: Description: Options:
ln ln [OPTIONS] TARGET... LINK_NAME|DIRECTORY Create a link named LINK_NAME or DIRECTORY to the specified TARGET. You may use '--' to indicate that all following arguments are non-options. -s make symbolic links instead of hard links
28/37
UM0477 Examples: Remarks: # ln -s /tmp/from /tmp/to
System commands reference
Only applicable to read-write filesystems such as /tmp subtree and USB mass storage devices, if mounted. Can not be used on elements of flashed root filesystem.
Name: Synopsys: Description: Options:
ls ls [OPTIONS] [FILE...] List directory contents. -1 -C -c -d -e -l -L -R -S -t -u -x -X # ls -lR list files in a single column list entries by columns with -l: show creation time list directory entries instead of contents list both full date and full time use a long listing format list entries pointed to by symbolic links list subdirectories recursively sort the listing by file size with -l: show modification time with -l: show access time list entries by lines instead of by columns (default) sort the listing by extension
Examples:
Name: Synopsys: Description: Remarks:
l smod lsmod List the currently loaded kernel modules. To get more detailed information, use the following command: cat /proc/modules
Name: Synopsys: Description: Options: Examples:
m kdir mkdir [OPTION] DIRECTORY... Create the DIRECTORY(ies) if they do not already exist. -m -p set permission mode (as in chmod), not rwxrwxrwx - umask no error if existing, make parent directories as needed
# mkdir /tmp/foo # mkdir /tmp/foo /tmp/foo: File exists # mkdir /tmp/foo/bar/baz /tmp/foo/bar/baz: No such file or directory # mkdir -p /tmp/foo/bar/baz Only applicable to writable filesystems such as /tmp subtree and USB mass storage devices, if mounted. Can not be used on elements of flashed root filesystem.
Remarks:
29/37
System commands reference Name: Synopsys: Description: Options: m knod mknod [OPTIONS] NAME TYPE MAJOR MINOR Create a special file (block, character, or pipe).
UM 0 4 7 7
-m Create the special file using the specified mode (default a=rw) TYPEs include: b Make a block (buffered) device c Make a character (un-buffered) device p Make a named pipe. MAJOR and MINOR are ignored for named pipes # mknod /dev/gpio 5 251 0 Only applicable to writable filesystems such as /tmp subtree and USB mass storage devices, if mounted. Can not be used on elements of flashed root filesystem.
Examples: Remarks:
Name: Synopsys: Description: Examples:
more more A filter for viewing standard output one screen at a time. # ls /bin | more
Name: Synopsys: Description: Options:
mount mount [flags] DEVICE NODE [-o options,more-options] Mount a filesystem. Returns 0 for success, number of failed mounts for -a, or errno for one mount. -o option One of many filesystem options, listed below -t fs-type Specify the filesystem type Options for use with the "-o'' flag: ro/rw: Mount for read-only / read-write There are other flags that are specific to each filesystem (see Linux documentation). # mount -t tmpfs -o size=4M tmpfs /tmp
Examples:
Name: Synopsys: Description: Options:
mv mv [OPTION]... SOURCE DEST mv [OPTION]... SOURCE... DIRECTORY Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY. -f -i Don't prompt before overwriting Interactive, prompt before overwrite
30/37
UM0477 Examples: Remarks: $ mv /tmp/file1 /tmp/file2
System commands reference
Destination must be on a writable filesystem such as /tmp subtree or USB mass storage devices, if mounted. Can not be on flashed root filesystem.
Name: Synopsys: Description: Options:
netstat netstat [OPTIONS] Displays Linux networking information. -l -a -e -n -r -t -u -w -x Display listening server sockets Display all sockets (default: connected) Display other/more information Don't resolve names Display routing table TCP sockets UDP sockets Raw sockets Local (Unix) sockets
Examples:
# netstat -l
Name: Synopsys: Description: Options:
p ing ping [OPTION]... host Send ICMP ECHO_REQUEST packets to specified host. -c COUNT -s SIZE -q Send only COUNT pings Send SIZE data bytes in packets (default=56) Quiet mode, only displays output at start and when finished
Examples:
# ping 192.168.1.1
Name: Synopsys: Description: Examples:
ps ps Repor t process status. # ps PID Uid 10 20 ... 735 0 785 0 VmSize Stat Command 280 S init RWN [ksoftirqd/0] 344 S 304 R /bin/ash ps
31/37
System commands reference Name: Synopsys: Description: Examples: pwd pwd Print the full filename of the current working directory. # cd /usr/lib # pwd /usr/lib
UM 0 4 7 7
Name: Synopsys: Description: Options:
rm rm [OPTION]... FILE... Remove (unlink) the FILE(s). You may use '--' to indicate that all following arguments are non-options. -i -f -r Always prompt before removing each destination Remove existing destinations, never prompt Remove the contents of directories recursively
Examples: Remarks:
# rm -fr /tmp/foo Only applicable to read-write filesystems such as /tmp subtree and USB mass storage devices, if mounted. Can not be used on elements of flashed root filesystem.
Name: Synopsys: Description: Examples:
rmmod rmmod [MODULE]... Unloads the specified kernel module(s) from the kernel. # rmmod mymodule.ko
Name: Synopsys: Description: Options: Examples:
route route [add|del] ... Display or edit the kernel's IP routing tables. See standard Linux documentation for more details. -n -e Don't resolve names Display other/more information
# route Kernel IP routing table Destination Gateway Genmask Iface 192.168.1.0 * 255.255.255.0 eth0
Flags U
MSS Window 0 0
irtt 0
# route add -net 192.56.76.0 netmask 255.255.255.0 dev eth0 Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface
32/37
UM0477 192.168.1.0 eth0 192.56.76.0 eth0 * * 255.255.255.0 255.255.255.0 U U
System commands reference 0 0 0 0 0 0
Name: Synopsys: Description: Examples: Remarks:
rx rx FILE Receive a file using the XModem protocol over UART. # rx /tmp/foo Destination must be on a read-write filesystem such as /tmp subtree and USB mass storage devices, if mounted. Can not be on flashed root filesystem.
Name: Synopsys: Description:
s ync sync Write all buffered filesystem blocks to target device.
Name: Synopsys: Description: Examples:
t est test EXPRESSION or [ EXPRESSION ] Checks file types and compares values returning an exit code determined by the value of EXPRESSION. See Linux documentation for all available expressions. # # 1 # # 0 test 1 -eq 2 echo $? test 1 -eq 1 echo $?
Name: Synopsys: Description: Options:
t ftp tftp [OPTION]... HOST [PORT] Transfers a file from/to a TFTP server using binary mode. -l FILE Specify local FILE -r FILE Specify remote FILE -g Get request (host to board) -p Put request (board to host) -b SIZE Transfer blocks of SIZE octets # tftp -g -r app -l /tmp/app 192.168.1.1 For Get requests, destination must be on a read-write filesystem such as /tmp subtree and USB mass storage devices, if mounted. Can not be on flashed root filesystem.
33/37
Examples: Remarks:
System commands reference Name: Synopsys: Description: Examples: umount umount FILESYSTEM|DIRECTORY Unmount file system(s). Remove temporary RAM file system: # umount /tmp
UM 0 4 7 7
Name: Synopsys: Description: Examples:
usleep usleep N Pause for N microseconds. Star t a 1 second delay: # usleep 10 0 00
34/37
UM0477
Quick operation guide
Appendix C
Quick operation guide
This section provides a summary of most frequently used commands relevant to the root filesystem and performed in the different contexts: Table 8.
Context
Frequently used commands
Command Description Rebuilds the root filesystem (CRAMFS image and expanded tree) according to current (default or custom) configuration. Updates the root filesystem on NOR Flash getting the new image by Ethernet from a remote TFTP server. Updates the root filesystem on NOR Flash getting the new image by serial link from a remote Kermit server. Configures the board for using the root filesystem on NOR Flash. Configures the board for using the root filesystem on NFS remote server. Displays current kernel and user Linux processes. Sets the IP address of the board's Ethernet port Transfers a file (e.g.`app') from the host PC to the board RAM disk over Ethernet. Transfers a file (e.g.`log.txt') from to the board RAM disk to the host PC over Ethernet. Transfers a file (e.g.`app') from the host PC to the board RAM disk over serial link. Enables access to a plugged-in USB storage device (e.g a pendrive) that will be visible under /mnt/usb1 Disable access to a plugged-in USB storage device (e.g a pendrive)
Host PC Linux build.sh rootfs shell
U-Boot console run flash_root_eth
U-Boot console run flash_root_uart
U-Boot console run fboot U-Boot console run nboot Linux console Linux console Linux console Linux console Linux console ps ifconfig eth0 192.168.1.10 tftp g r app -l /tmp/app 192.168.1.1 tftp p -l /tmp/log.txt r log.txt 192.168.1.1 rx /tmp/app mount t vfat /dev/sda1 /mnt/usb1 umount /dev/sda1
Linux console
Linux console
35/37
Revision history
UM0477
8
Revision history
Table 9.
Date 14-Nov-2007 17-Sep-2008
Document revision history
Revision 1 2 Initial release. Minor package upgrade, mainly extending DDR clock to 266 MHz and supporting Gigabit Ethernet Changes
36/37
UM0477
Please Read Carefully:
Information in this document is provided solely in connection with ST products. STMicroelectronics NV and its subsidiaries ("ST") reserve the right to make changes, corrections, modifications or improvements, to this document, and the products and services described herein at any time, without notice. All ST products are sold pursuant to ST's terms and conditions of sale. Purchasers are solely responsible for the choice, selection and use of the ST products and services described herein, and ST assumes no liability whatsoever relating to the choice, selection or use of the ST products and services described herein. No license, express or implied, by estoppel or otherwise, to any intellectual property rights is granted under this document. If any part of this document refers to any third party products or services it shall not be deemed a license grant by ST for the use of such third party products or services, or any intellectual property contained therein or considered as a warranty covering the use in any manner whatsoever of such third party products or services or any intellectual property contained therein.
UNLESS OTHERWISE SET FORTH IN ST'S TERMS AND CONDITIONS OF SALE ST DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY WITH RESPECT TO THE USE AND/OR SALE OF ST PRODUCTS INCLUDING WITHOUT LIMITATION IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE (AND THEIR EQUIVALENTS UNDER THE LAWS OF ANY JURISDICTION), OR INFRINGEMENT OF ANY PATENT, COPYRIGHT OR OTHER INTELLECTUAL PROPERTY RIGHT. UNLESS EXPRESSLY APPROVED IN WRITING BY AN AUTHORIZE REPRESENTATIVE OF ST, ST PRODUCTS ARE NOT DESIGNED, AUTHORIZED OR WARRANTED FOR USE IN MILITARY, AIR CRAFT, SPACE, LIFE SAVING, OR LIFE SUSTAINING APPLICATIONS, NOR IN PRODUCTS OR SYSTEMS, WHERE FAILURE OR MALFUNCTION MAY RESULT IN PERSONAL INJURY, DEATH, OR SEVERE PROPERTY OR ENVIRONMENTAL DAMAGE.
Resale of ST products with provisions different from the statements and/or technical features set forth in this document shall immediately void any warranty granted by ST for the ST product or service described herein and shall not create or extend in any manner whatsoever, any liability of ST.
ST and the ST logo are trademarks or registered trademarks of ST in various countries. Information in this document supersedes and replaces all information previously supplied. The ST logo is a registered trademark of STMicroelectronics. All other names are the property of their respective owners.
2008 STMicroelectronics - All rights reserved STMicroelectronics group of companies Australia - Belgium - Brazil - Canada - China - Czech Republic - Finland - France - Germany - Hong Kong - India - Israel - Italy - Japan Malaysia - Malta - Morocco - Singapore - Spain - Sweden - Switzerland - United Kingdom - United States of America www.st.com
37/37
|