To add a board, you have to check the following:
* embedded peripherals used
* external peripherals
* memory mapping
You should create a file {{{<board>_devices.c}}} in the directory {{{arch/arm/mach-lpc22xx}}} of the linux kernel, this will included the description of:
* memory mapping, especially the MTD partitions
* board related structure for the various drivers (see {{{include/asm-arm/arch-lpc22xx/board.h}}})
* platform_device structure for the various external peripherals
This file shall be added in the {{{arch/arm/mach-lpc22xx/Kconfig-boards}}} with a config entry {{{BOARD_<cpu>_<board>}}} in the choice {{{NXP LPC22XX based board}}} and don#t forget to make it {{{depends CPU_<cpu>}}}. You can add a specific board related configuration menu, if required.
Add a compilation entry {{{obj-$(CONFIG_BOARD_<cpu>_<board>) += <board>_devices.c}}} in the {{{arch/arm/mach-lpc22xx/Makefile}}} .
The following application as been successfully tested on the Linux for LPC22XX:
*Core applications
**[[init]]
**[[sh]] -- a SHELL application (sash)
**[[busybox]]
* Flash applications
**[[mtd-utils]]
* Network applications
**[[ftpd]] -- a FTP deamon
**[[telnetd]] -- a TELNET deamon
**[[mathopd]] -- an HTTP deamon
**[[ftp]] -- a FTP client
**[[telnet]] -- a TELNET client
**[[stunnel]] -- a SSL tunneling
* Libraries
**[[libssl]] -- a SSL library
**[[zlib]]
<<<
The "~U-Boot" Universal Bootloader project provides firmware for many CPU architectures and boards with full source code under GPL.
<<<
!~WebSite
*http://u-boot.sourceforge.net/ -- Home site
*ftp://ftp.denx.de/pub/u-boot/ -- Tarball repository
*http://www.denx.de/cgi-bin/cvsweb/ -- CVS repository
*http://news.gmane.org/gmane.comp.boot-loaders.u-boot -- Mailing list
!Usage
The image to use with u-boot is uLinux.bin, zLinux.bin or xLinux.bin respectively uncompressed, compressed or XIP image (not all images could be available).
Note: the kernel start location is defined by {{{TODO... }}} [hardcoded in arch/arm/mm/Makefile to {{{0xA0008000}}}].
!!ROMFS boot
!!!with uLinux.bin and romfs.bin in NAND
{{{
# setenv bootcmd setenv bootargs console=ttyS0,38400N8 root=/dev/ram initrd=0xA1800000,4096K\;nand read a1000000 0 20000\;nand read a1800000 0 20000;\bootm a1000000
# saveenv
}}}
!!ROOTNFS boot
!!!with uLinux.bin in NAND
{{{
# setenv ipaddr 192.168.0.1
# setenv serverip 192.168.0.2
# setenv bootcmd setenv bootargs console=ttyS0,38400N8 root=/dev/nfs ip=\$(ipaddr) nfsroot=\$(serverip):/romfs,proto=tcp\;nand read a1000000 0 20000\;bootm a1000000
# saveenv
}}}
!!!with uLinux.bin in TFTP server
{{{
# setenv ipaddr 192.168.0.1
# setenv serverip 192.168.0.2
# setenv bootcmd setenv bootargs console=ttyS0,38400N8 root=/dev/nfs ip=\$(ipaddr) nfsroot=\$(serverip):/romfs,proto=tcp\;tftpboot a1000000 uLinux.bin\;bootm a1000000
# saveenv
}}}
!Internals
* bootargs are stored at offset 0x0100 of the internal SRAM starting [0x40000100]
* kernel configuration
** Select {{{System Type}}} > {{{Board options}}} > {{{bootloader used}}}
** Set {{{System Type}}} > {{{Board options}}} > {{{bootargs Address}}} to {{{0x40000100}}}
!How to hack u-boot
For the LPC2468, u-boot is stored at {{{0x00000000}}} and then relocated at {{{0xA1F00000}}}.
This entry will be updated soon...
!~LC2214 notes
|!Sectors|!addresses|!Size|!Description|
| 0-15 |{{{0x00000000-0x0003BFFF}}}| 240kB|u-boot|
| 16 |{{{0x0003C000-0x0003DFFF}}}| 8kB|u-boot environment|
| 17 |{{{0x0003E000-0x0003FFFF}}}| 8kB|Flash Boot Loader (RO)|
!Pre-requisite
*Download the [[openssl-0.9.7g.tar.gz|uClinux-dist/lib/openssl-0.9.7g.tar.gz]] tarball ([[www|http://www.openssl.org/source/openssl-0.9.7g.tar.gz]])
*Download the [[openssl-0.9.7g.diff|uClinux-dist/lib/openssl-0.9.7g.diff]] patch
!Install in {{{uClinux-dist/user}}}
{{{
$ tar jxvf openssl-0.9.7g.tar.bz2
$ patch -p1 <openssl-0.9.7g.diff
$ ln openssl-0.9.7g libssl -s -f
}}}
!Patch
* Use {{{Makefile.uclinux}}} instead {{{Makefile}}} in lib/subdirs in file {{{lib/Makefile}}}
* Change link path to {{{$(ROOTDIR)/lib/libssl/include}}} in file {{{include/Makefile}}}
* Change copy path to {{{$(ROOTDIR)/lib/libssl}}} in file {{{lib/Makefile}}}
* Add the file {{{lib/libssl/Makefile.uclinux}}}
!TODO
* Introduce a build directory {{{libssl/build}}}
* Build HOST tools
!Integration
*In {{{uClinux-dist/user}}} directory
*Download the [[busybox-1.6.0.tar.bz2|uClinux-dist/user/busybox-1.6.0.tar.bz2]] tarball ([[www|http://www.busybox.net/downloads/busybox-1.6.0.tar.bz2]])
*Untar {{{tar jxvf busybox-1.6.0.tar.bz2}}}
*Download the [[busybox-1.6.0.patch|uClinux-dist/user/busybox-1.6.0.patch]] patch
*Patch {{{patch -p1 busybox-1.6.0.patch}}}
*Link {{{ln busybox-1.6.0 busybox -s -f}}}
!Configuration
!Patch
!Integration
*In {{{uClinux-dist/user}}} directory
*Download the [[busybox-1.5.1.tar.bz2|uClinux-dist/user/busybox-1.5.1.tar.bz2]] tarball ([[www|http://www.busybox.net/downloads/busybox-1.5.1.tar.bz2]])
*Untar {{{tar jxvf busybox-1.5.1.tar.bz2}}}
*Download the [[busybox-1.5.1.diff|uClinux-dist/user/busybox-1.5.1.diff]] patch
*Patch {{{patch -p1 busybox-1.5.1.diff}}}
*Link {{{ln busybox-1.5.1 busybox -s -f}}}
!Configuration
There is an terminal interactive configuration:
{{{
make -C user/busybox menuconfig
}}}
!Compilation
This is done by the standard uClinux Makefile.
!Test on ~EmbeddedArtists' ~LPC2468 OEM Board
!!Host environment
The test has been made when built on the following configuration:
**arm-linux-gcc from snapgear
**patched uClinux-dist-20070103 / patched linux-2.6.21
**uClibc 0.29.7 as included in uClinux-dist-20070130
**patched busybox-1.5.1
!!What has been tested
!Pre-requisite
*Download the [[linux-2.6.21.tar.bz2|uClinux-dist/linux-2.6.21.tar.bz2]] tarball ([[www|http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2]]) md5: {{{1b515f588078dfa7f4bab2634bd17e80}}}
*Download the [[linux-2.6.21-uc0-big.patch.gz|uClinux-dist/linux-2.6.21-uc0-big.patch.gz]] patch ([[www|http://www.uclinux.org/pub/uClinux/uClinux-2.6.x/linux-2.6.21-uc0-big.patch.gz]]) md5: {{{1b515f588078dfa7f4bab2634bd17e80}}}
*Download the [[linux-2.6.21-uc0.patch|uClinux-dist/linux-2.6.21-uc0.patch]] patch
*Download the [[linux-2.6.21-uc0.config|uClinux-dist/linux-2.6.21-uc0.config]] configuration
!Install in {{{uClinux-dist}}}
{{{
$ tar jxvf linux-2.6.21.tar.bz2
$ gzip –dc linux-2.6.21-uc0-big.patch.gz | patch –p0
$ mv linux-2.6.21 linux-2.6.21-uc0
$ patch -p1 <linux-2.6.21-uc0.patch
$ rm linux-2.6.x -r
$ ln linux-2.6.21-uc0 linux-2.6.x -s -f
$ cp linux-2.6.21-uc0.config linux-2.6.x/.config
}}}
!Patch
To be continued...
This is a "temporary" introduction how to build uClinux with u-boot-1.6.6, linux-2.6.21-uc0 and vendors snapshots in the Embedded Artists ~EA-OEM-101 ~VmWare image.
!Update the Host
When including ~JFFS2 in the kernel of uClinux, it is required that you have installed the following additional package using e.g. ''Synaptic package Manager'':
* zlib1g-dev
!Requirements
Download the following components (in {{{/home/user}}} directory):
* [[arm-linux-tools-20061213.tar.gz|arm-linux-tools-20061213.tar.gz]] ([[www|http://ftp.snapgear.org/pub/snapgear/tools/arm-linux/arm-linux-tools-20061213.tar.gz]]) - snapgear Toolchain gcc-3.4.4 binutils-2.16
* [[uClinux-dist-20070130.tar.bz2|uClinux-dist-20070130.tar.bz2]] ([[www|http://www.uclinux.org/pub/uClinux/dist/uClinux-dist-20070130.tar.bz2]]) - uClinux snapshot
* [[linux-2.6.21-uc0.tar.bz2|linux-2.6.21-uc0.tar.bz2]] snapshot
* [[u-boot-1.1.6.tar.bz2]|u-boot-1.1.6.tar.bz2]] snapshot
* [[vendors.tar.bz2|vendors.tar.bz2]] snapshot
!Install the toolchain
In a shell terminal do the following:
{{{
$ su
Password: root
$ cd /
$ tar zxvf /home/user/arm-linux-tools-20061213.tar.gz
$ exit
}}}
!Install and update uClinux-dist
You can optionally remove the former uClinux-dist snapshot:
{{{
# rm uClinux-dist-20051014 -r
}}}
In a shell terminal do the following:
{{{
# tar jxvf uClinux-dist-20070130
# ln uClinux-dist-20070130 uClinux-dist -s
# cd uClinux-dist
# rm linux-2.0.x -r
# rm linux-2.4.x -r
# rm linux-2.6.x -r
# tar jxvf ../linux-2.6.21-uc0.tar.bz2
# ln linux-2.6.21-uc0 linux-2.6.x -s
# tar jxvf ../u-boot-1.6.6.tar.bz2
# ln u-boot-1.6.6 u-boot -s
# tar jxvf ../vendors.tar.bz2
}}}
!Configure
{{{
# cp linux-2.6.x/.config linux-2.6.21-uc0.config
# make menuconfig
# cp linux-2.6.x.config linux-2.6.21-uc0/.config
}}}
Set the following for the menuconfig:
* Select {{{Vendor/Product Selection}}} -> {{{Vendor}}} = {{{NXP}}}
* Select {{{Vendor/Product Selection}}} -> {{{NXP Product}}} = {{{LPC2468}}}
* Select {{{Kernel/Library/Defaults Selection}}} -> {{{Kernel Version}}} = {{{linux-2.6.x}}}
* Select {{{Kernel/Library/Defaults Selection}}} -> {{{Libc Version}}} = {{{uClibc}}}
!Compile
{{{
# cd u-boot
# make -f Makefile.uclinux
# cd ..
# mkdir images
# make
# u-boot/tools/mkimage -A arm -O linux -T kernel -C none -a 0xa0008000 -e 0xa0008000 -n "Linux 2.6.21" -d linux-2.6.x/arch/arm/boot/Image images/uLinux.bin
}}}
You will get the following images:
* {{{images/u-boot.bin}}} - the u-boot image
* {{{images/uLinux.bin}}} - the uncompressed linux image for u-boot
* {{{images/romfs.bin}}} - the romfs image
You will also in romfs directory the basis for your rootfs. You have to make mknod in romfs/dev.
!Pre-requisite
*[[libssl]]
!Install in {{{uClinux-dist/user}}}
{{{
$ tar zxvf stunnel-4.20
$ ln stunnel-4.20 stunnel -s -f
$ patch -p1 <stunnel-4.20-uclinux.diff
}}}
!Patch
In uClinux directory, use the following command:
{{{
make linux_menuconfig
}}}
!Kernel configuration
* Unselect {{{MMU-based Pages Memory Management Support}}}
* Choose in {{{System Type}}} > {{{ARM system type}}} = {{{NXP LPC22XX Family}}}
* Choose in {{{System Type}}} > {{{NXP LPC22XX type}}} your cpu
* Choose in {{{System Type}}} > {{{NXP LPC22XX Options}}} any applicable options for your case
** Select in {{{System Type}}} > {{{NXP LPC22XX Options}}} > {{{NXP LPC22XX Block selection}}} that you want to enable and any applicable options for this block
* Choose in {{{System Type}}} > {{{Board type}}} your board
* Choose in {{{System Type}}} > {{{<board> Options}}} any applicable options for your case
!LPC2468 configuration notes
* The LPC2468 enables the selection of the PCLK for each individual peripheral among four values. You can configure this for each peripheral where this is relevant.
[[Installing Eclipse under Linux|Eclipse - Installing Eclipse under Linux]]
[[Your Eclipse First Project|Eclipse - Your Eclipse First Project]]
!Toolchain
!Bootloader
* [[u-boot|Bootloader - u-boot]] [[u-boot-1.2-0|ftp://ftp.denx.de/pub/u-boot/u-boot-1.1.6.tar.bz2]] {{ckecklistOkClass{OK}}} [[u-boot-1.2-0|ftp://ftp.denx.de/pub/u-boot/u-boot-1.2.0.tar.bz2]] {{checklistUpdateClass{Update}}}
** Supported CPU: {{ckecklistOkClass{LPC2468}}} {{ckecklistTodoClass{LPC2214}}} {{ckecklistTodoClass{LPC2292}}}
!Kernel
* [[linux-2.6.21|http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.21.tar.bz2]] {{ckecklistOkClass{OK}}}
** Supported CPU: {{ckecklistOkClass{LPC2468}}} {{ckecklistTodoClass{LPC2214}}} {{ckecklistTodoClass{LPC2292}}}
* Drivers
**
!Libraries
TODO
!Applications
TODO
!IDE
TODO
Here some explanation about the combination of snapgear toolchain and uClibc apply on the hello world exmaple.
!!{{{hello.c}}}
{{{
#include <stdio.h>
int main() {
printf("Hello World!!");
}
}}}
!!!{{{Makefile}}}
{{{
hello: hello.o
arm-linux-gcc -nostdinc -I /home/user/uClinux-dist/include/include-linux -idirafter /home/user/uClinux-dist/include -isystem /home/user/uClinux-dist/uClibc/include -isystem /home/user/uClinux-dist/include/gcc -L /home/user/uClinux-dist/lib -L /home/user/uClinux-dist/uClibc/lib -nostdlib /home/user/uClinux-dist/uClibc/lib/crt1.o /home/user/uClinux-dist/uClibc/lib/crti.o -msoft-float -Wl,-elf2flt -D__PIC__ -fpic -msingle-pic-base -Wl,--warn-common -Wl,--sort-common -o hello hello.o -t -Wl,--start-group -lc -lgcc -Wl,--end-group /home/user/uClinux-dist/uClibc/lib/crtn.o
hello.o: hello.c
arm-linux-gcc -nostdinc -I /home/user/uClinux-dist/include/include-linux -idirafter /home/user/uClinux-dist/include -isystem /home/user/uClinux-dist/uClibc/include -isystem /home/user/uClinux-dist/include/gcc -msoft-float -D__PIC__ -fpic -msingle-pic-base -Dlinux -D__linux__ -Dunix -D__uClinux__ -c -o hello.o hello.c
}}}
!java Installation as pre-requisite
NOTE: This step is not required, if you have already installed Sun's JRE or JDK.
Eclipse is written in Java and require that you have a running Java environment (Sun's JRE or JDK). You can download JRE or JSK from the following address: http://java.sun.com/javase/downloads/. Select either "JDK" or "Java Runtime Environment (JRE)" and download the "Linux self-extrating file". As super user do the following:
{{{
$su
# cd /usr/local/lib
# sh <download-path>/<jdk|jre>-<version>-linux-i586.bin
# cd /usr/local/bin
# ln -sf /usr/local/lib/<install-path>/bin/* .
# cd /
# java -version
<download-path> is the path where you downloaded the JRE or JDK
<jdk|jre> is either "jdk" or "jre".
<version> is the version you downloaded
<install-path> is where the path where the jre or jdk had self-unpacked
}}}
For more information: http://wiki.serios.net/wiki/Debian_Java_JRE/JDK_installation#Manual_installation
!eclipse 3.2 Installation
NOTE: This step is not required, if you have already installed Eclipse
Eclipse installation under Debian is quite easy use your package manager: apt-get, aptitude, synaptic.
The package is "eclipse" and optionally "eclipse-nls" for language support.
Repository entry:
deb http://ftp.debian.org/debian/ etch main
!embeddedCDT Installation
Download the ZYLIN plugin from: http://www.zylin.com/embeddedcdt.html => Latest snapshot
Copy the respectively features and plugins in the corresponding eclipse directories /usr/share/eclipse/features and /usr/share/eclipse/plugins.
{{{
# unzip embeddedcdt-linux-gtk-2006-20060908.zip
# mv plugins/* /usr/lib/eclipse/plugins/
# mv features/* /usr/lib/eclipse/features/
# unzip zylincdt-20060908.zip
# mv plugins/* /usr/lib/eclipse/plugins/
}}}
Your first project step by step
* Start eclipse, Applications > Programming > Eclipse in GNOME Desktop menu
* Setup a Project
** Open the New Project wizard, File > New > Project... in Eclipse menu
** Select a Standard Make C Project in the first wizard panel then click Next >
** Give a Project Name e.g. ~HelloWorld in the second wizard and and then Click Finish
* Create file
** Open the New Source File wizard, New > Source heFile in ~HelloWorld project contextual menu
** Enter the source code see hello.c example in [[HelloWorld|Eclipse - HelloWorld]]
<<<
The Boot Loader controls initial operation after reset, and also provides the means to
accomplish programming of the Flash memory. This could be initial programming of a
blank device, erasure and re-programming of a previously programmed device, or
programming of the Flash memory by the application program in a running system.
<<<
This will allow the programmation of the
!~HowTo
The P2.10 shall be tighted low at reset time to enter the ISP (~In-System Programming) mode.
To enter the ISP mode on [[EmbeddedArtists]]' LPC2468 OEM Board, maintain pressed the button P2.10 ~EINT0 and then press the button RESET.
Send the character '?', which is responded by "Synchronized<CR><LF>".
Then send "Synchronized<CR><LF>" and "<crystal frequency><CR><LF>".
As an hacker, you want to:
*[[understand the source repository]]
*[[modify the kernel|Modify the kernel]]
*[[update the kernel|Update the kernel]]
*[[modify an application|Modify an application]]
*[[update an application|Update an application]]
*[[add an application|Add an application]]
*[[add a new cpu|Add a new cpu]]
*[[add a new board|Add a new board]]
*[[add a new platform driver|Add a new platform driver]]
*[[create a patch file for an application]]
*[[building linux kernel from snapshots|Building linux kernel from snapshots]]
According the GPL which covers most of the code, you have to made the changes publicly available. The above link will give you some guideline howto do that.
There are two hosts considered:
* Linux Debian for
** kernel and standard application development including the Linux Cross Tool Chain
** custom application
* Microsoft Windows with Cygwin
** Windows Cross Tool Chain
** custom application
Here a couple of HOWTO:
* [[Configuring Debian|Debian - Configuration]]
Installing Linux as well as u-boot can be made at various level:
*[[Installing Linux from scratch]]
*[[Installing Linux from u-boot]]
*[[Installing Linux from linux]]
*[[Installing u-boot from u-boot]]
*[[Installing u-boot using JTAG]]
*[[Installing u-boot using UART0]]
!Install from a nfsroot server in Flash
!!Pre-requisites
*linux and romfs binaries respectively the files {{{uLinux.bin}}} (or {{{zLinux.bin}}}) and {{{romfs.bin}}} are available in the root directory of the nfs host directory and fits the size of the targeted MTD partitions
*terminal connection with the target
!!Howto install in NOR Flash and boot from it
{{{
$ cat /proc/mtd
...
mtd3: 00200000 00001000 "NOR linux"
mtd4: 00200000 00001000 "NOR romfs"
...
# flashcp -v /uLinux.bin /dev/mtd3
...
# flashcp -v /romfs.bin /dev/mtd4
...
$ reboot
[break u-boot to jump in interactive mode]
u-boot# setenv bootargs console=ttyS0,38400N8 root=/dev/ram initrd=0xA1800000,4000K ip=$(ipaddr)
u-boot# cp.b 80000000 a1000000 100000;cp.b 80400000 a1100000 100000
u-boot# cp.b 80200000 a1800000 100000;cp.b 80600000 a1900000 100000
u-boot# bootm a1000000
}}}
If you want always to boot from the NOR Flash with a romfs, you can set the following environment variables in u-boot:
{{{
u-boot# setenv bootargs console=ttyS0,38400N8 root=/dev/ram initrd=0xA1800000,4000K ip=$(ipaddr)
u-boot# setenv bootcmd 'cp.b 80000000 a1000000 100000;cp.b 80400000 a1100000 100000;cp.b 80200000 a1800000 100000;cp.b 80600000 a1900000 100000;bootm a1000000'
u-boot# saveenv
}}}
If you want only to test your new environment instead executing {{{saveenv}}}, do {{{run bootcmd}}}.
!!Howto install in NOR Flash and boot from it
{{{
$ cat /proc/mtd
...
mtd3: 00200000 00001000 "NOR linux"
mtd4: 00200000 00001000 "NOR romfs"
...
# flashcp -v /uLinux.bin /dev/mtd3
...
# flashcp -v /romfs.bin /dev/mtd4
...
$ reboot
[break u-boot to jump in interactive mode]
u-boot# setenv bootargs console=ttyS0,38400N8 root=/dev/ram initrd=0xA1800000,4000K ip=$(ipaddr)
u-boot# cp.b 80000000 a1000000 100000;cp.b 80400000 a1100000 100000
u-boot# cp.b 80200000 a1800000 100000;cp.b 80600000 a1900000 100000
u-boot# bootm a1000000
}}}
If you want always to boot from the NOR Flash with a romfs, you can set the following environment variables in u-boot:
{{{
u-boot# setenv bootargs console=ttyS0,38400N8 root=/dev/ram initrd=0xA1800000,4000K ip=$(ipaddr)
u-boot# setenv nor_boot 'cp.b 80000000 a1000000 100000;cp.b 80400000 a1100000 100000;cp.b 80200000 a1800000 100000;cp.b 80600000 a1900000 100000;bootm a1000000'
u-boot# saveenv
}}}
If you want only to test your new environment instead executing {{{saveenv}}}, do {{{run nor_boot}}}.
If you want to automatically boot from NOR Flash do the following:
{{{
u-boot# setenv bootcmd 'run nor_boot'
u-boot# saveenv
}}}
!!Howto install in NAND Flash and boot from it
{{{
$ cat /proc/mtd
mtd0: 00200000 00002000 "NAND linux"
mtd1: 00200000 00002000 "NAND romfs"
...
# flashcp -v /uLinux.bin /dev/mtd0
...
# flashcp -v /romfs.bin /dev/mtd1
...
$ reboot
[break u-boot to jump in interactive mode]
u-boot# setenv bootargs console=ttyS0,38400N8 root=/dev/ram initrd=0xA1800000,4000K ip=$(ipaddr)
u-boot# cp.b 80000000 a1000000 100000;cp.b 80400000 a1100000 100000
u-boot# cp.b 80200000 a1800000 100000;cp.b 80600000 a1900000 100000
u-boot# bootm a1000000
}}}
If you want always to boot from the NAND Flash with a romfs, you can set the following environment variables in u-boot:
{{{
u-boot# setenv bootargs console=ttyS0,38400N8 root=/dev/ram initrd=0xA1800000,4000K ip=$(ipaddr)
u-boot# setenv nand_boot 'nand read a1000000 0 200000;nand read a1800000 200000 400000;bootm a1000000'
u-boot# saveenv
}}}
If you want only to test your new environment instead executing {{{saveenv}}}, do {{{run nand_boot}}}.
If you want to automatically boot from NAND Flash do the following:
{{{
u-boot# setenv bootcmd 'run nand_boot'
u-boot# saveenv
}}}
The installation of Linux from scratch will require first the programmation of u-boot in the internal flash by using the In-System Programming (ISP) over a serial line, which will allow the programmation of the internal flash.
!Pre-requisites
* flash programming tool or intelligent serial terminal
* u-boot binary
!Howto Program u-boot
TODO...
!Howto Configure u-boot
TODO...
Next step [[Installing Linux from u-boot]]
The installation of Linux from u-boot will require first the programmation of linux and romfs in the external flash by using u-boot, which will allow the programmation of the external flash.
!Pre-requisites
* linux and romfs binaries available on an ftp server or on a ~SD-card
!Howto from a ftp server
TODO...
!Howto from a ~SD-card
TODO...
!Using nfsroot instead romfs
TODO...
Next step [[Using Linux]]
!WINDOWS
!!Pre-requisites
* [[Amontec JTAGkey|http://www.amontec.com/jtagkey.shtml]] hardware from [[Amontec|http://www.amontec.com/]]
!Download
* [[Amontec JTAG key Drivers for Windows|http://www.amontec.com/fix/project/jtagkey/win2k_xp/amontec_jtagkey_utils_060307_setup.exe]]
* [[OpenOCD setup|http://developer.berlios.de/project/shownotes.php?release_id=10757]] - see also [[OpenOCD|http://openocd.berlios.de/web/]] for more information
!Install
* Install the Amontec JTAG key Drivers for Windows
* Connect the JTAG devices and install the driver as explained in the Amontec's Application Note [[Installation user guide for Windows|http://www.amontec.com/pub/amt_ann006.pdf]]
* Install the ~OpenOCD using the downloaded setup file
''NOTE:'' In the configuration file, you have to configure the flash using the following {{{flash bank lpc2000 <base> <size> 0 0 <variant> <target#> <clock> ['calc_checksum']}}}
!!~OpenOCD for ~LPC2214
!!!Configuration
The following configuration shall be prepared for an ~LPC2214, e.g. {{{lpc2xxx_jtagkey.cfg}}} stored in the same directory as the {{{openocd-ftd2xx.exe}}} file:
{{{
#daemon configuration
telnet_port 4444
gdb_port 3333
#interface
interface ftd2xx
ftd2xx_device_desc "Amontec JTAGkey A"
ftd2xx_layout jtagkey
ftd2xx_vid_pid 0x0403 0xcff8
jtag_speed 3
jtag_nsrst_delay 200
jtag_ntrst_delay 200
#use combined on interfaces or targets that can't set TRST/SRST separately
reset_config trst_and_srst srst_pulls_trst
#jtag scan chain
#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE)
jtag_device 4 0x1 0xf 0xe
#target configuration
daemon_startup reset
#target <type> <startup mode>
target arm7tdmi little run_and_init 0 arm7tdmi-s_r4
run_and_halt_time 0 30
#internal sram configuration
working_area 0 0x40000000 0x4000 nobackup
#internal flash configuration
flash bank lpc2000 0x0 0x40000 0 0 lpc2000_v1 0 14745 calc_checksum
# For more information about the configuration files, take a look at:
# http://openfacts.berlios.de/index-en.phtml?title=Open+On-Chip+Debugger
}}}
''NOTE:'' Don't forget to tight low the P1.26 on the ~LPC2214 before reseting to enable the JTAG in debug mode, and that before starting the ~OpenOCD deamon.
''NOTE:'' The value of jtag_speed can be 1, 2 or 3. In case of difficulty, try the different values.
!!!~OpenOCD Daemon
Start openocd daemon in command line has follow:
{{{
openocd-ftd2xx.exe -f lpc2xxx_jtagkey.cfg
}}}
!!!~OpenOCD Commands
The following command is used to write the ~LPC2214 flash using a {{{telnet localhost 4444}}} connection to openocd deamon:
{{{
> flash erase 0 0 16
> flash write 0 u-boot.bin 0x0
}}}
An additional write is required to write the u-boot parameters.
!!~OpenOCD for ~LPC2468
This is similar to ~LPC2214 with the following differences:
* In the configuration file, change that: {{{flash bank lpc2000 0x0 0x7d000 0 0 lpc2000_v2 0 12000 calc_checksum}}}
* Tigh high DBGEN to enable the JTAG in debug mode
''NOTE:'' The sector located from 0x7d000-0x7dfff is not accesible with this version of OpenOCD.
!LINUX
Same as above can be made in Linux...
!Kernel
[[Building linux kernel from snapshots]]
[[Building linux kernel]]
[[Configuring linux kernel]]
[[Memory usage]]
!Kernel
* [[Initialization|Kernel - Initialization]]
* [[CLK|Kernel - CLK infrastructure]]
* [[IRQ|Kernel - IRQ infrastructure]]
* [[GPIO|Kernel - GPIO infrastructure]]
* [[DMA|Kernel - GPDMA]]
* [[PM|Kernel - PM infrastructure]]
!Drivers
!!~LPC22XX drivers
* [[GPIO|Kernel - GPIO driver]]
* [[Internal Flash MTD|Kernel - MTD driver - Internal Flash]]
* [[UART|Kernel - UART driver]]
* [[IRDA|Kernel - IRDA driver]]
* [[ETH|Kernel - ETH driver]]
* [[MCI|Kernel - MCI driver]]
* [[USB|Kernel - USB driver]]
* [[CAN|Kernel - CAN driver]]
* [[I2C|Kernel - I2C driver]]
* [[SPI|Kernel - SPI driver]]
* [[SSP|Kernel - SSP driver]]
* [[RTC|Kernel - RTC driver]] - on-chip Real Time Clock
* [[BRAM|Kernel - BRAM driver]] - on-chip backuped SRAM
* [[ADC|Kernel - ADC driver]]
* [[DAC|Kernel - DAC driver]]
* [[TIMER]]
* [[PWM]]
!!~LPC22XX drivers not planned
* {{{I2S}}}
* {{{WDT}}}
!!~EmbeddedArtists ~LPC2468 OEM Board
* [[EA's External NOR for LPC2468 OEM Board|Kernel - MTD driver - EA NOR Flash]]
* [[EA's External NAND for LPC2468 OEM Board|Kernel - MTD driver - EA NAND Flash]]
* [[EA's I2C EEPROM|Kernel - I2C driver - EEPROM]]
* [[EA's I2C PCA8572|Kernel - I2C driver - PCA8572]]
!Kernel configuration
* Configure the GPIO Device Driver:
** Select {{{Device Drivers}}} > {{{Caracter devices}}} > {{{NXP LPC22XX ADC Driver}}}
!Device Node
!!Major/Minor
{{{
MAJOR=122 MINOR=<adc_number>
}}}
!!Usage
{{{
# mkdir /dev/adc
# mknod /dev/adc/0 c 122 0
}}}
!Programmation
- synchronously fread with a minimum buffer of 5 characters. buffer[0..3] is the converted value in hexadecimal or "OVER" if the ADC is overrun (Vin>Vref).
!Kernel configuration
TODO...
!Source code
TODO...
!Test
TODO...
!Foreword
There are various existing models to implement CAN bus in linux:
* [[Linux CAN Bus project|http://home.wanadoo.nl/arnaud/]]
* [[CANFestival|http://www.canfestival.org/]] - a ~CANOpen framework
* [[Socket-CAN|http://developer.berlios.de/projects/socketcan/]]
* [[Very Simple Control Protocol and friends|http://www.vscp.org/]] - see also for can [[http://sourceforge.net/projects/can/|http://sourceforge.net/projects/can/]]
* [[CANBUS4LINUX|http://canbus4linux.sourceforge.net/]] - see also [[CAN200 Linux Project|http://private.addcom.de/horo/can200/]]
Other resources:
* [[Peak-System Linux|http://www.peak-system.com/linux/]] - PCAN drivers for LINUX
!Kernel configuration
TODO...
!Source code
TODO...
!Test
TODO...
The clock infrastrcuture offers an abstraction model used to by the driver to know the clock(s) used by a given device.
This infrastrure is imporant when the system and peripheral clocking can be adjusted on use needs.
There are 3 types of clocks:
* system clocks
* derived clocks from system clock - which is used to represent divider (and/or multiplier)
* linked clocks to system or derived clock, which is used to represent the result of a selection among clocks
The linked clocks are used by the driver in their hardware abstraction.
Depending on the LPC2xxx, the modeling differs.
For the ~LPC2468, the following system clocks are available:
* {{{clk_rc}}} - This is the Internal RC oscillator (~4MHz)
* {{{clk_main}}} - This is the Main oscillator (1-24MHz)
* {{{clk_rtc}}} - This is the RTC oscillator (32.768kHz)
* {{{clk_pllclk}}} - The clock parent is selected among {{{clk_rc}}} (default), {{{clk_main}}} or {{{clk_rtc}}}, which is procedeed by the through a PLL with a {{{M}}} multiplier and {{{N}}} divider.
* {{{hclk}}} - This is clock is selected among the parent of {{{clk_pllclk}}} and {{{clk_pllclk}}}.
* {{{cclk}}} - This is the CPU clock, which is derived from {{{hclk}}} with a {{{N}}} divider.
* {{{pclk_cclk4}}} - This is a peripheral clock which is equal to {{{cclk/4}}}
* {{{pclk_cclk2}}} - This is a peripheral clock which is equal to {{{cclk/2}}}
* {{{pclk_cclk1}}} - This is a peripheral clock which is equal to {{{cclk}}}
* {{{pclk_hclk8}}} - This is a peripheral clock which is equal to {{{hclk/8}}}
* {{{pclk_hclk6}}} - This is a peripheral clock which is equal to {{{hclk/6}}}
* {{{pclk_<peripheral>}}} - This is a peripheral clock linked to one of the above perpheral system clocks
* {{{uclk_[master|host|device|otg|i2c]}} - This is a the allocation of one of to a above pclk to the peripheral clock
!Source
* The include file is in {{{include/asm-arm/mach-lpc22xx/clock.h}}} which can be included {{{include <asm/arch/clock.h>}}}
* The source is in {{{arch/arm/mach_lpc22xx/clock.c}}}
!!{{{include/asm-arm/mach-lpc22xx/clock.h}}}
The {{{struct clk}}} includes the following that could be initialized:
* {{{const char * name}}} - (required) This is the name used to retrieve the clock. If multiple name is given, the first registered clcok will be returned by {{{clk_get()}}}.
* {{{struct device *dev}}} - (optional) This is the device that is served by this clock. This
* {{{int multiplier}}} - (optional) This is any applicable multiplier applicable to the rate.
* {{{int divider}}} - (optional) This is any applicable divider applicable to the rate.
* {{{int rate}}} - This is the rate. If 0, the rate is get from the parent using {{{clk_get_rate(this->parent)}}}.
* {{{struct clk *parent}}} - This is the parent clock used for computing the rate, when not given.
* {{{int clkid}}} - This is an id used for hardware settings.
* {{{int pwrid}}} - This is an id used for hardware settings.
* {{{unsigned type}}} - This is the type of the clock ored with the following values: {{{CLK_TYPE_PRIMARY}}}, {{{CLK_TYPE_SYSTEM}}}, {{{CLK_TYPE_PERIPHERAL}}}.
* {{{int users}}} - This is the current number of subscribers to this clk. Put 1, if the clk shall never be disabled.
The include publish also this external definition for the following clock structures, which can then be referenced:
* lpc22xx_rtc_clock
* lpc22xx_pclk_cclk4_clock
* lpc22xx_pclk_cclk1_clock
* lpc22xx_pclk_cclk2_clock
* lpc22xx_pclk_hclk6_clock - only for LPC2468
* lpc22xx_pclk_hclk8_clock - only for LPC2468
The include published also this external functions:
* {{{__init lpc22xx_clk_init()}}} - This function registers all primary and system clocks and is defined in {{{include/asm-arm/mach-lpc22xx/clock.c}}} and shall be called during the kernel initialization before any reference to a clock through get_clk()
* {{{__init lpc22xx_clk_peripheral_init()}}} - This function registers all peripheral clocks and is defined in {{{include/asm-arm/mach-lpc22xx/<cpu>_cpu.c}}} and is called by the {{{lpc22xx_clk_init()}}} function.
* {{{__init lpc22xx_clk_register()}}} - This function allows to register an individual clk not done through {{{lpc22xx_clk_init()}}} or {{{lpc22xx_clk_peripheral_init()}}} functions.
* {{{__init lpc22xx_clk_associate()}}} - This function allows to associate a device to a clk.
* {{{lpc22xx_clk_get_clkid()}}} - This function allows to associate a device to a clk.
!Note for hackers
At late_initcall of the kernel initialization, all unused clk are disabled.
!Kernel configuration
* Configure the GPIO Device Driver:
** Select {{{Device Drivers}}} > {{{Caracter devices}}} > {{{NXP LPC22XX ADC Driver}}}
!Device Node
!!Major/Minor
{{{
MAJOR=123 MINOR=<adc_number>
}}}
!!Usage
{{{
# mknod /dev/dac c 123 0
}}}
!Programmation
- synchronously fwrite with a minimum buffer of 5 characters. buffer[0..3] is the converted value in hexadecimal.
!Source code
* Board Data in file {{{arch/arm/mach_lpc22xx/<board>_board.c}}} as defined in file {{{include/asm-arm/arch-lpc22xx/board.h}}} - see also [[add a new board|Add a new board]]
* Platform Device definition in file {{{arch/arm/mach_lpc22xx/<cpu>_cpu.c}}}
* See also files {{{arch/arm/mach_lpc22xx/Kconfig-features}}} and {{{arch/arm/mach_lpc22xx/Kconfig-lpc2468}}}
* Platform Driver code in file {{{drivers/char/dac-lpc22xx.c}}}
* See also files {{{drivers/char/Kconfig}}} and {{{drivers/char/Makefile}}}
!Kernel configuration
TODO...
!Source code
TODO...
!Test
TODO...
!LInks
see http://standards.ieee.org/regauth/oui/index.shtml
!Foreword
The GPDMA controller is based on the ARM ~PrimeCell ~PL081 Single Master DMA Controller. {{{MMCIPerifID=0x000410081}}} / {{{MMCICellID=0xB105F00D}}}.
!Source
* The include file is in {{{include/asm-arm/mach-lpc22xx/dma.h}}} which can be included {{{include <asm/arch/dma.h>}}}
* The source is in {{{arch/arm/mach_lpc22xx/dma.c}}}
!!driver information
* {{{DRIVER_NAME "pl081-smdma"}}}
* resources for the platform driver:
** a {{{IORESOURCE_MEM}}} in the platform device
** a {{{IORESOURCE_IRQ}}} in the platform device
** a clock linked either to the device or the {{{DRIVER_NAME}}}
!!{{{include/asm-arm/mach-lpc22xx/dma.h}}}
The include published also this external functions:
* {{{lpc22xx_request_channel()}}} - Allocate a channel, with the following parameters
**
** {{{int timeout}}} - try to allocate a channel 10 times in this timeout period (in jiffies). 0 = no timeout, and try one time
** return a pointer on the allocated channel structure or NULL
* {{{lpc22xx_free_channel()}}} - Free a channel, with the folllowing parameters
** struct xxx *channel - the channel to free
* {{{lpc22xx_config_dma()}}} - TODO To be described...
* {{{lpc22xx_dma_pack_control()}}} - TODO To be described...
* {{{lpc22xx_dma_parse_control()}}} - TODO To be described...
* {{{lpc22xx_config_channel()}}} - TODO To be described...
* {{{lpc22xx_channel_get_config()}}} - TODO To be described...
* {{{lpc22xx_dma_ch_enable()}}} - TODO To be described...
* {{{lpc22xx_dma_ch_disable()}}} - TODO To be described...
* {{{lpc22xx_dma_ch_enabled()}}} - TODO To be described...
* {{{lpc22xx_dma_split_head_entry()}}} - TODO To be described...
* {{{lpc22xx_dma_split_ll_entry()}}} - TODO To be described...
* {{{lpc22xx_alloc_ll_entry()}}} - TODO To be described...
* {{{lpc22xx_free_ll_entry()}}} - TODO To be described...
* {{{lpc22xx_free_ll()}}} - TODO To be described...
The GPIO driver presents the various available ~GPIOs to the application through devices. This driver offers also a pseudo file {{{/proc/drivers/gpio/<port_number>}}}, which summarizes the ~GPIOs for a given port.
!Kernel configuration
* Configure the GPIO Device Driver:
** Select {{{Device Drivers}}} > {{{Caracter devices}}} > {{{NXP LPC22XX GPIO Driver}}}
!Device Node
!!Major/Minor
{{{
MAJOR=121 MINOR=<gpio_number>
<gpio_number>=<port_number>*32+<pin_number>
}}}
!!Usage
{{{
# mkdir /dev/gpio
# mknod /dev/gpio/0 c 121 0
}}}
!Programmation
- synchronously fread with a minimum buffer of 2 characters. buffer[0] is '0', '1' or '-'.
- synchronously fwrite with a minimum buffer of 2 characters. buffer[0] is '0' or '1'.
!Kernel configuration
Enable the EEPROM driver, which will be used for all enabled ~I2C blocks:
{{{
Linux Kernel Configuration
Device Drivers --->
I2C support --->
<*> I2C support
Miscellaneous I2C Chip support --->
<*> EEPROM reader
(32768) EEPROM reader
}}}
!EmbeddedArtists LPC2468 OEM Board V1.1
On this board there is a 24AA256SN EEPROM - 256kbit (32kbytes) with A0=A1=A2=WP=0 located at ~I2C address: 0x50.
!Kernel configuration
1. Enable the ~I2C block(s), e.g. ~LPC2468 ~I2C0:
{{{
Linux Kernel Configuration
System Type --->
NXP LPC22XX Options --->
NXP LPC22XX Block selection --->
[*] NXP LPC22XX I2C0
NXP LPC22XX I2C0 PCLK (CCLK) --->
(100000) NXP LPC22XX I2C0 Clock
NXP LPC2468 Pin selection for P0 --->
NXP LPC2468 P0.27 (P0.27 is SDA0) --->
NXP LPC2468 P0.28 (P0.28 is SCL0) --->
}}}
2. Enable the ~I2C driver, which will be used for all enabled ~I2C blocks:
{{{
Linux Kernel Configuration
Device Drivers --->
I2C support --->
<*> I2C support
<*> I2C device interface
I2C Hardware Bus support --->
<*> NXP LPC22XX I2C support
}}}
The ~I2C device interface is assigned to MAJOR=89.
{{{
$ mknod /dev/i2c0 c 89 0
}}}
3. Enable the ~I2C Chips
[[I2C EEPROM|Kernel - I2C EEPROM driver]]
!Source code
!!Foreword
The ~I2C peripheral is based on the PCA algorithm.
''NOTE:'' There is a preexisting implementation for this algorithm (see {{{dirvers/i2c/algos/i2c-algo-pca.c}}})
!!Files
* Board Data in file {{{arch/arm/mach_lpc22xx/<board>_board.c}}} as defined in file {{{include/asm-arm/arch-lpc22xx/board.h}}} - see also [[add a new board|Add a new board]]
* Platform Device and Peripheral Clock definition in file {{{arch/arm/mach_lpc22xx/<cpu>_cpu.c}}} - see also [[add a new cpu|Add a new cpu]]
* See also files {{{arch/arm/mach_lpc22xx/Kconfig-features}}} and {{{arch/arm/mach_lpc22xx/Kconfig-lpc2468}}}
* Platform Driver code in file {{{drivers/i2c/busses/i2c-lpc22xx.c}}}
* See also files {{{drivers/i2c/busses/Kconfig}}} and {{{drivers/i2c/busses/Makefile}}}
!!Board Data
TODO...
!!Platform Device And Peripheral Clock
TODO...
On the ARM, there is only one IRQ line. The IRQ is dispatched using irq_chip(s). The chips are the following:
* VIC - This managed the hardware interrupt sources.
* GPIO - This managed the GPIO related interrupts and it is connected on the VIC IRQ 17 (this IRQ is shared with the ~EINT3).
* USB - This managed the USB related interrupts and it is connected on the VIC IRQ 22.
The CPU will be detected using the IAP command - Read Part Identification number:
* ~LPC2468 => {{{0x0603FF35}}}
This identification will avoid the start of a kernel for unsupported CPU.
!Foreword
The SD/MMC Card peripheral is based on the ARM ~PrimeCell ~PL180 Multimedia Card Interface (obsolete since March 2006!!!). {{{MMCIPerifID=0x000410180}}} / {{{MMCICellID=0xB105F000}}}.
''NOTE:'' There is a preexisting implementation for this device, but without DMA support.
!Kernel configuration
* Configure the MMC Device Driver:
** Select {{{Device Drivers}}} > {{{MMC/SD Card Support}}} > {{{MMC support}}} => ~CONFIG_MMC
** Select {{{Device Drivers}}} > {{{MMC/SD Card Support}}} > {{{MMC device block driver}}} => ~CONFIG_MMC_BLOCK
** Select {{{Device Drivers}}} > {{{MMC/SD Card Support}}} > {{{NXP LPC22XX SD/MMC Card Interface support}}} => ~CONFIG_MMC_LPC22XX
* Configure the File System (currently DOS/FAT base file system)
** Select {{{File systems}}} > {{{DOS/FAT/NT Filesystems}}} > {{{MSDOS fs support}}} => ~CONFIG_MSDOS_FS
** Select {{{File systems}}} > {{{DOS/FAT/NT Filesystems}}} > {{{VFAT (Windows 95) fs support}}} => ~CONFIG_VFAT_FS
** Set {{{File systems}}} > {{{DOS/FAT/NT Filesystems}}} > {{{Default codepage for FAT}}} = {{{437}}} => ~CONFIG_FAT_DEFAULT_CODEPAGE
** Select {{{File systems}}} > {{{DOS/FAT/NT Filesystems}}} > {{{Default iocharset for FAT}}} = {{{iso8859-1}}} => ~CONFIG_FAT_DEFAULT_IOCHARSET
* Configure the Native Language Support
** Select {{{File systems}}} > {{{Native Language Support}}} > {{{Default NLS option}}} = {{{iso8859-1}}} => ~CONFIG_NLS_DEFAULT
** Select {{{File systems}}} > {{{Native Language Support}}} > {{{Codepage 437 (United States, Canada)}}} => ~CONFIG_NLS_CODEPAGE_437
!Source code
* Board Data in file {{{arch/arm/mach_lpc22xx/<board>_board.c}}} - see also [[add a new board|Add a new board]]
* Platform Device definition in file {{{arch/arm/mach_lpc22xx/<cpu>_cpu.c}}}
* Platform Driver code in file {{{drivers/mmc/mci-lpc22xx.c}}}
* See also files {{{drivers/mmc/Kconfig}}} and {{{drivers/mmc/Makefile}}}
!Board Data
The Board data allows you to give indication about your hardware to the driver. This is done in the {{{struct board_data_mci}}}, with the following fields:
* cd_pin - gpio pin number, on which is connected the card detect switch (card inserted is low) - an interrupt will be generated on both level change on this pin
* wp_pin - gpio pin number, on which is connected the write protrect switch (write protect is low)
* wire4 - MCIDAT[0..3] available
* vcc_polarity - MCIPWR activation polarity
!Test
{{{
$ cat /proc/devices
...
Block devices:
...
254 mmc
$
$ mount /dev/mmc1 /media/mmc
}}}
!See also
* PL180 Technical Reference Manual from ARM
* [[Note for the hardware designer]]
The MTD (Memory Technology Device) drivers are found in the subsystem of the same name, which make simple and easy the access on memory devices.
There can be up to three MTD drivers types found in a LPC22XX based system corresponding each to a type of Flash:
* Internal Flash
* External NOR Flash
* External NAND Flash
For the EmbeddedArtists' LPC2468 OEM Board, the drivers are the following:
* [[Internal Flash MTD|Kernel - MTD driver - Internal Flash]]
* [[EA's External NOR for LPC2468 OEM Board|Kernel - MTD driver - EA NOR Flash]]
* [[EA's External NAND for LPC2468 OEM Board|Kernel - MTD driver - EA NAND Flash]]
!Hardware
The NAND Flash on the Embedded Artists ~LPC2468 OEM Board is a Samsung 128Mbi (K9xxx) enabled by the !~CS1 [0x81000000-0x81FFFFFF]. The ALE signal is connected on A19. The CLE signal is connected on A20.
!Kernel configuration
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Memory Technology Devices (MTD) support}}} => ~CONFIG_MTD
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{MTD partitioning support}}}, if the partitioning is set during kernel init phase => ~CONFIG_MTD_PARTITIONS
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Direct char device access to MTD devices}}}, if you want to set character device node to MTD devices (major=90) => ~CONFIG_MTD_CHAR
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Caching block device access to MTD devices}}}, if you want to set block device node to MTD devices (major=31) => ~CONFIG_MTD_BLOCK
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{NAND Flash device Drivers}}} > {{{NAND Device Support}}} => ~CONFIG_MTD_NAND
!Source code
* Platform Device definition in file {{{arch/arm/mach_lpc22xx/lpc2468_ea_board.c}}}
* Partition definition in file {{{arch/arm/mach_lpc22xx/lpc2468_ea_board.c}}}
!See also
* [[Installing Linux from linux]]
!Introduction
There is an hardware issue related with the wiring of the SST’s NOR Flash. The A22 of the CPU is connected to the A19 of the NOR Flash. This result to the flowing mapping of the NOR Flash, which splits the 4Mb in 4 non-consecutive zones of 1Mb (0x00100000) having 256 sectors of 4096 bytes:
|Flash address |CPU address |Flash images view from CPU address|
|0x00000000 |0x80000000 |0x80100000, 0x80800000, 0x80900000|
|0x00100000 |0x80400000 |0x80500000, 0x80C00000, 0x80D00000|
|0x00200000 |0x80200000 |0x80300000, 0x80A00000, 0x80B00000|
|0x00300000 |0x80600000 |0x80700000, 0x80E00000, 0x80F00000|
This requires the use of the "non-linear mappings of flash chip" feature of the kernel for this Flash and to write the mapping code.
''Note:'' The board CANNOT be equipped with a 8Mb NOR Flash (SST39VF6401) as the A21 of the 8Mb NOR Flash (pin 13) is not connected to any address line of the LPC2468!!!
!Kernel configuration
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Memory Technology Devices (MTD) support}}} => ~CONFIG_MTD
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{MTD partitioning support}}}, if the partitioning is set during kernel init phase => ~CONFIG_MTD_PARTITIONS
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Direct char device access to MTD devices}}}, if you want to set character device node to MTD devices (major=90) => ~CONFIG_MTD_CHAR
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Caching block device access to MTD devices}}}, if you want to set block device node to MTD devices (major=31) => ~CONFIG_MTD_BLOCK
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{RAM/ROM/Flash chip drivers}}} > {{{Detect flash chips by Common Flash Interface (CFI) probe}}} => ~CONFIG_MTD_CFI
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{RAM/ROM/Flash chip drivers}}} > {{{Detect non-CFI AMD/~JEDEC-compatible flash chips}}} => ~CONFIG_MTD_JEDECPROBE
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Flash chip driver advance configuration options}}} => ~CONFIG_MTD_CFI_ADV_OPTIONS
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Specific CFI Flash geometry selection}}} => ~CONFIG_MTD_CFI_GEOMETRY
* ''Deselect'' {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Support 8 bit bus}}} => ~CONFIG_MTD_MAP_BANK_WIDTH_1
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Support 16 bit bus}}} => ~CONFIG_MTD_MAP_BANK_WIDTH_2
* ''Deselect'' {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Support 32 bit bus}}} => ~CONFIG_MTD_MAP_BANK_WIDTH_4
* ''Deselect'' {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Support 64 bit bus}}} => ~CONFIG_MTD_MAP_BANK_WIDTH_8
* ''Deselect'' {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Support 128 bit bus}}} => ~CONFIG_MTD_MAP_BANK_WIDTH_16
* ''Deselect'' {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Support 256 bit bus}}} => ~CONFIG_MTD_MAP_BANK_WIDTH_32
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Support 1-chip flash interleave}}} => ~CONFIG_MTD_CFI_I1
* ''Deselect'' {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Support 2-chip flash interleave}}} => ~CONFIG_MTD_CFI_I2
* ''Deselect'' {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Support 4-chip flash interleave}}} => ~CONFIG_MTD_CFI_I4
* ''Deselect'' {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Support 8-chip flash interleave}}} => ~CONFIG_MTD_CFI_I8
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{RAM/ROM/Flash chip drivers}}} > {{{Support AMD/Fujitsu chips}}} => ~CONFIG_MTD_CFI_AMDSTD
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Mapping drivers for chip access}}} > {{{Support non-linear mappings of flash chips}}} => ~CONFIG_MTD_COMPLEX_MAPPINGS
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Mapping drivers for chip access}}} > {{{CFI Flash device mapped on EmbeddedArtists LPC2468 OEM Board}}} => ~CONFIG_MTD_LPC2468_EA_FLASH
''Note:'' The bus width and interleave settings are very important or you will detect another Flash instead the ~SST39VF3201!!!
!Source code
* Platform Device definition in file {{{arch/arm/mach_lpc22xx/lpc2468_ea_board.c}}}
* Platform Driver code in file {{{drivers/mtd/maps/mtd-lpc2468-ea-flash.c}}}
* Add ~SST39VF3201 entry in jedec_table in file {{{drivers/mtd/chips/jedec_probe.c}}}
* See also files {{{drivers/mtd/maps/Kconfig}}} and {{{drivers/mtd/maps/Makefile}}}
* Partition definition in file {{{arch/arm/mach_lpc22xx/lpc2468_ea_board.c}}}
!Test
{{{
$ cat /proc/mtd
...
mtd3: 00200000 00001000 "NOR linux"
mtd4: 00200000 00001000 "NOR romfs"
...
$ flash_eraseall /dev/mtd[n]
...
$ hexdump /dev/mtd[n]
0000000 ffff ffff ffff ffff ffff ffff ffff ffff
*
0200000
$ flashcp -v /uLinux.bin /dev/mtd[n]
...
$ reboot
[break u-boot to jump in interactive mode]
u-boot# cp.b 80000000 a1000000 100000;cp.b 80400000 a1100000 100000;bootm a1000000
...
}}}
!See also
* [[Installing Linux from linux]]
!Kernel configuration
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Memory Technology Devices (MTD) support}}} => ~CONFIG_MTD
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{MTD partitioning support}}}, if the partitioning is set during kernel init phase => ~CONFIG_MTD_PARTITIONS
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Direct char device access to MTD devices}}}, if you want to set character device node to MTD devices (major=90) => ~CONFIG_MTD_CHAR
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Caching block device access to MTD devices}}}, if you want to set block device node to MTD devices (major=31) => ~CONFIG_MTD_BLOCK
* Select {{{Device Drivers}}} > {{{Memory Technology Devices (MTD)}}} > {{{Self-contained MTD device drivers}}} > {{{NXP LPC22XX Internal Flash MTD driver}}} => ~CONFIG_MTD_LPC22XX_FLASH
!Source code
* Partition definition in file {{{arch/arm/mach_lpc22xx/<board>_board.c}}} - see also [[add a new board|Add a new board]]
* Platform Device definition in file {{{arch/arm/mach_lpc22xx/<cpu>_cpu.c}}}
* Platform Driver code in file {{{drivers/mtd/devices/mtd-lpc22xx-flash.c}}}
* See also files {{{drivers/mtd/devices/Kconfig}}} and {{{drivers/mtd/devices/Makefile}}}
!Test
{{{
$ cat /proc/mtd
...
mtd5: 00030000 00008000 "U-boot"
mtd6: 00048000 00008000 "User1"
mtd7: 00004000 00001000 "User2"
mtd8: 00002000 00001000 "U-boot params"
mtd9: 00002000 00001000 "Flash Boot Loader"
$ flash_eraseall /dev/mtd7
...
$ hexdump /dev/mtd7
0000000 ffff ffff ffff ffff ffff ffff ffff ffff
*
0004000
$ flashcp -v /etc/rc /dev/mtd7
...
}}}
!Installing u-boot in the Internal Flash
According that the file {{{u-boot.bin}}} is available on the root directory.
{{{
$ cat /proc/mtd
...
mtd5: 00030000 00008000 "U-boot"
mtd6: 00048000 00008000 "User1"
mtd7: 00004000 00001000 "User2"
mtd8: 00002000 00001000 "U-boot params"
mtd9: 00002000 00001000 "Flash Boot Loader"
$ flashcp -v /u-boot.bin /dev/mtd5
...
}}}
The Power Management infrastructure allows the change of CPU mode to adapt the consumption to the actual need. The LPC2XXX family offers multiple and fine Power Management policies for the CPU but also for the individual peripherals.Each driver shall implement the chosen policies as well as wake-up capability when possible, e.g. ~Wake-Up on LAN, ~Wake-Up on RTC Alarm, etc...
To be conitnued...
!Kernel configuration
TODO...
!Source code
TODO...
!Test
TODO...
!Kernel configuration
1. Enable the SPI block(s), e.g. ~LPC2468 SPI:
{{{
Linux Kernel Configuration
System Type --->
NXP LPC22XX Options --->
NXP LPC22XX Block selection --->
[*] NXP LPC22XX SPI
NXP LPC22XX SPI PCLK (CCLK) --->
NXP LPC2468 Pin selection for P0 --->
NXP LPC2468 P0.15 (P0.15 is SCK) --->
NXP LPC2468 P0.16 (P0.16 is SSEL) --->
NXP LPC2468 P0.17 (P0.17 is MISO) --->
NXP LPC2468 P0.18 (P0.18 is MOSI) --->
}}}
2. Enable the ~SPI driver, which will be used for all enabled ~SPI blocks:
{{{
Linux Kernel Configuration
Device Drivers --->
SPI support --->
[*] SPI support
<*> NXP LPC22XX SPI support
}}}
The ~SPI device interface is assigned to MAJOR=tbd.
{{{
$ mknod /dev/spi c tbd 0
}}}
!Source code
!!Files
* Board Data in file {{{arch/arm/mach_lpc22xx/<board>_board.c}}} as defined in file {{{include/asm-arm/arch-lpc22xx/board.h}}} - see also [[add a new board|Add a new board]]
* Platform Device and Peripheral Clock definition in file {{{arch/arm/mach_lpc22xx/<cpu>_cpu.c}}} - see also [[add a new cpu|Add a new cpu]]
* See also files {{{arch/arm/mach_lpc22xx/Kconfig-features}}} and {{{arch/arm/mach_lpc22xx/Kconfig-lpc2468}}}
* Platform Driver code in file {{{drivers/spi/spi-lpc22xx.c}}}
* See also files {{{drivers/spi/Kconfig}}} and {{{drivers/spi/Makefile}}}
!!Board Data
The Board data contains the following fields:
>NO FIELD
!!Platform Device And Peripheral Clock
TODO...
!Kernel configuration
1. Enable the SSP block(s), e.g. ~LPC2468 SSP0:
{{{
Linux Kernel Configuration
System Type --->
NXP LPC22XX Options --->
NXP LPC22XX Block selection --->
[*] NXP LPC22XX SSP0
NXP LPC22XX SSP0 PCLK (CCLK) --->
(???) NXP LPC22XX SSP0 Mode --->
NXP LPC2468 Pin selection for P0 --->
NXP LPC2468 P0.15 (P0.15 is SCK0) --->
NXP LPC2468 P0.16 (P0.16 is SSEL0) --->
NXP LPC2468 P0.17 (P0.17 is MISO0) --->
NXP LPC2468 P0.18 (P0.18 is MOSI0) --->
}}}
Select between the 3 possible modes:
- {{{POLL}}}
- {{{IRQ}}}
- {{{DMA}}} - Note that DMA is shared between the MCI and ~SSPs drivers
''NOTE:'' The GPDMA has only 2 DMA channels shared by the MCI (1 channel) and ~SSPs (2 channels foe a SSP). There is no sense to use DMA on both channels, even unexpected behaviour can be observed (quasi dead-lock when both channels tries to get their dma channels at the same times)!!!!
2. Enable the SSP driver, which will be used for all enabled SSP blocks:
{{{
Linux Kernel Configuration
Device Drivers --->
SPI support --->
[*] SPI support
<*> NXP LPC22XX SSP support
}}}
The SSP device interface is assigned to MAJOR=tbd.
{{{
$ mknod /dev/ssp0 c tbd 0
}}}
!Source code
!!Files
* Board Data in file {{{arch/arm/mach_lpc22xx/<board>_board.c}}} as defined in file {{{include/asm-arm/arch-lpc22xx/board.h}}} - see also [[add a new board|Add a new board]]
* Platform Device and Peripheral Clock definition in file {{{arch/arm/mach_lpc22xx/<cpu>_cpu.c}}} - see also [[add a new cpu|Add a new cpu]]
* See also files {{{arch/arm/mach_lpc22xx/Kconfig-features}}} and {{{arch/arm/mach_lpc22xx/Kconfig-lpc2468}}}
* Platform Driver code in file {{{drivers/spi/ssp-lpc22xx.c}}}
* See also files {{{drivers/spi/Kconfig}}} and {{{drivers/spi/Makefile}}}
!!Board Data
The Board data contains the following fields:
* {{{mode}}} - {{{LPC22XX_SPI_POLL}}}, {{{LPC22XX_SPI_IRQ}}} or {{{LPC22XX_SPI_DMA}}}
!!Platform Device And Peripheral Clock
TODO...
!Foreword
The USB block contains four elements:
There are 3 possible configurations:
|U1| OTG | HOST | HOST |
|U2| HOST | HOST | DEVICE |
The Embedded Artits hardware offers the following connectors:
* U1: USB type Mini/AB
* U2: USB type A for Host and USB type B for Device
!Kernel configuration
* Select in {{{System Type}}} > {{{NXP LPC22XX Options}}} > {{{NXP LPC22XX Block selection}}}, the USB blocks:
** {{{NXP LPC22XX USB HOST}}} - follow with [[USB HDC OHCI driver|Kernel - USB driver - HDC OHCI]]
** {{{NXP LPC22XX USB DEVICE}}} - follow with [[USB UDC driver|Kernel - USB driver - UDC]]
** {{{NXP LPC22XX USB DEVICE is mapped on Port 2}}} - only possible when not using {{{USB OTG}}}
** {{{NXP LPC22XX USB OTG}}} - only possible when {{{USB HOST}}} and {{{USB DEVICE}}} are both enabled - follow with [[USB OTG driver|Kernel - USB driver - OTG]]
* Select the PIN mode {{{System Type}}} > {{{NXP LPC2468 Pin Selection for Px}}}
!USB architecture
The USB architecture involves many pieces:
* [[USB HDC OHCI driver|Kernel - USB driver - HDC OHCI]]
* [[USB UDC driver|Kernel - USB driver - UDC]]
* [[USB OTG driver|Kernel - USB driver - OTG]]
* [[USB I2C bus driver|Kernel - USB driver - I2C]]
* [[USB I2C chip driver - ISP1301|Kernel - USB driver - I2C ISP1301]]
* [[CLK|Kernel - CLK infrastructure]] - uclk_host, uclk_device, uclk_i2c, uclk_otg and uclk_main.
* [[IRQ|Kernel - IRQ infrastructure]]
!Kernel configuration
* Configure the USB Host Driver (OHCI HDC):
** Select {{{Device Drivers}}} > {{{USB Support}}} > {{{Support for Host-side USB}}}
** Select {{{Device Drivers}}} > {{{USB Support}}} > {{{OHCI HCD support}}}
* Configure the USB Mass Storage as example for the test:
** Select {{{Device Drivers}}} > {{{SCSI device support}}} > {{{SCSI device support}}}
** Select {{{Device Drivers}}} > {{{SCSI device support}}} > {{{SCSI disk support}}}
** Select {{{Device Drivers}}} > {{{USB Support}}} > {{{USB Mass Storage support}}}
! Rootfs configuration
* USB Mass Storage devices
{{{
$ mknod /dev/sda b 8 0
$ mknod /dev/sda1 b 8 1
$ mknod /dev/sda2 b 8 2
$ mknod /dev/sda3 b 8 3
$ mknod /dev/sda4 b 8 4
}}}
!Test
* USB Mass Storage devices
{{{
$ mkdir /mnt/media
$ mount /dev/sda1 /mnt/media
}}}
!Source code
* Host related source (with OTG capability) [there can be two instances]:
** {{{driver/usb/host/ohci-hdc.c}}} - This is the OHCI HCD main.
** {{{driver/usb/host/ohci-lpc22xx.c}}} - This is the OHCI HCD stub for the ~LPC22XX included in the previous file.
* Device related source (with OTG capability)
** {{{driver/usb/gadget/lpc22xx_udc.c}}} - This is ~LPC22XX's USB Device Chip driver.
* OTG related source
** {{{driver/i2c/busses/i2c-pnx.c}}} - This is the i2c bus used by USB OTG on the ~LPC22XX.
** {{{driver/i2c/chips/isp1301_lpc22xx.c}}} - This is the ~ISP1301 chip connected on the ~LPC22XX.
TODO...
!Resource Data
* platform device "lpc22xx-ohci" with 2 resources: {{{RESOURCE_MEM}}} and {{{RESOURCE_IRQ}}}
* clock "clk_usbclk"
* clock "pclk_usb"
!Board Data
The Board data allows you to give indication about your hardware to the driver. This is done in the {{{struct board_data_usb}}}, with the following fields:
!Foreword
The USB ~I2C peripheral is based on the NXP PI3204 block. It exists two driver implementation:
* one for the {{{PNX010x}}}/{{{PNX4008}}} (C) 2004-2006 Monta Vista (included in kernel snapshot)
* one for the {{{LPC3180}}} based on coe for {{{SAA7752}}} (C) 2003-2004 Philips Semiconductors (found in ~LPC3180 BSP for linux-2.6.10 made by phytec)
The first has been used and patched.
* Configure a the ~I2C bus:
** Select {{{Device Drivers}}} > {{{I2C support}}} > {{{I2C support}}} => ~CONFIG_I2C
** Select {{{Device Drivers}}} > {{{I2C support}}} > {{{I2C Hardware Bus support}}} > {{{I2C bus support for NXP PNX and LPC22XX USB OTG targets}}} => ~CONFIG_I2C_PNX
Continue with [[USB I2C chip driver - ISP1301|Kernel - USB driver - I2C ISP1301]]
!Source code
* Platform Device definition and related Platform Data in file {{{arch/arm/mach_lpc22xx/<cpu>_cpu.c}}}
* Patch of Platform Driver code in file {{{drivers/i2c/busses/i2c-pnx.c}}}
** {{{I2C_PNX_XFER_TIMEOUT}}} (instead {{{I2C_PNX_TIMEOUT}}}) for jiffies based timer
** Remove {{{start_bit}}} when not last message
** Add {{{IRQF_DISABLED}}} in irqflags when calling request_irq
* Patch {{{drivers/i2c/busses/Kconfig}}}
** Dependency and description of {{{I2C_PNX}}} updated
<<tabs txtHere
Configuration "Configuration" [[Kernel - USB driver - UDC : Configuration]]
Source "Source" [[Kernel - USB driver - UDC : Source]]
Links "Links" [[Kernel - USB driver : Links]]
>>
<<tabs txtHere
Configuration "Configuration" [[Kernel - USB driver - UDC - Ethernet Gadget : Configuration]]
Usage "Usage" [[Kernel - USB driver - UDC - Ethernet Gadget : Usage]]
Links "Links" [[Kernel - USB driver : Links]]
>>
1. Configure the [[USB UDC|Kernel - USB driver - UDC]]
2. Configure the Serial Gadget
{{{
Linux Kernel Configuration
Device Drivers --->
USB Support --->
USB Gadget Support --->
<M> USB gadget Drivers
<M> Ethernet Gadget (with CDC Ethernet support)
[*] RNDIS support
}}}
''Note:'' The module is the file {{{linux/drivers/usb/gadgets/g_ether.ko}}}
''Note:'' The Ethernet Gadget requires two MAC address (see also [[ETH|Kernel - ETH driver]]) for both peers of the pseudo-Ethernel link
{{{
$ insmod g_ether.ko host_addr=00:1a:f1:12:34:56 dev_addr=00:1a:f1:78:9a:bc
}}}
!Install the Ethernet gadget on the target
{{{
$ insmod g_ether.ko host_addr=xx:xx:xx:12:34:56 dev_addr=xx:xx:xx:78:9a:bc
}}}
''Note:'' You have to use unique Ethernet addresses derived form an OUI or an IAB above xx:xx:xx for each Ethernet Gadget instance. For more information about OUI and IAB, refer http://standards.ieee.org/regauth/oui/index.shtml.
!Working with a Windows host
* Copy the [[linux.inf]] to your Windows Host (found in {{{linux/Documentation/usb/linux.inf}}} - can require a conversion to DOS format!!)
* Connect the target (USB Device port) to Windows host by an appropriate USB cable
* ''Found New Hardware Wizard'' appears, choose ''Install form a list or specific location (Advanced)'' and then click ''Next''
* Choose ''Search for the best driver in these locations'', unckec
!Working with a Linux host
''Note:'' The properties are the following:
* Name - RNDIS/Ethernet Gadget
* Device Instance Id - {{{USB\VID_0525&PID_A4A2\5&...&1}}}
* Hardware Ids - {{{USB\Vid_0525&Pid_a4a2&Rev_0219}}}
* Compatible Ids - {{{USB\Class_02&SubClass_02&Prot_ff}}}
<<tabs txtHere
Configuration "Configuration" [[Kernel - USB driver - UDC - File-backed Storage Gadget : Configuration]]
Usage "Usage" [[Kernel - USB driver - UDC - File-backed Storage Gadget : Usage]]
Links "Links" [[Kernel - USB driver : Links]]
>>
1. Configure the [[USB UDC|Kernel - USB driver - UDC : Configuration]]
2. Configure the Serial Gadget
{{{
Linux Kernel Configuration
Device Drivers --->
SCSI device support --->
[*] SCSI device support
[*] SCSI disk support
USB Support --->
USB Gadget Support --->
<M> USB gadget Drivers
<M> File-backed Storage Gadget
}}}
''Note:'' The module is the file {{{linux/drivers/usb/gadgets/g_file_storage.ko}}}
A Cable is connected between the USB-miniAB (as device) to a PC running Windows:
{{{
# plug a SD/MMC card
$ insmod g_file_storage.ko file=/dev/mmcblk0 # SD/MMC card visible as an USB Storage
# plug a USB stick
$ insmod g_file_storage.ko file=/dev/sda1 # USB stick visible as an USB Storage
}}}
A Cable is connected from USB mini-AB (as device) to USB-A as host:
{{{
$ insmod g_file_storage.ko file=/dev/mmcblk0 # SD card visible as an USB Storage to the board
}}}
<<tabs txtHere
Configuration "Configuration" [[Kernel - USB driver - UDC - Serial Gadget : Kernel Configuration]]
Usage "Usage" [[Kernel - USB driver - UDC - Serial Gadget : Usage]]
Links "Links" [[Kernel - USB driver : Links]]
>>
1. Configure the [[USB UDC|Kernel - USB driver - UDC : Configuration]]
2. Configure the Serial Gadget
{{{
Linux Kernel Configuration
Device Drivers --->
USB Support --->
USB Gadget Support --->
<M> USB gadget Drivers
<M> Serial Gadget (with CDC ACM support)
}}}
''Note:'' [[Serial Gadget|Kernel - USB driver - UDC - Serial Gadget]] module is the file {{{linux/drivers/usb/gadgets/g_serial.ko}}}
!Create a device node (only once)
Check the driver MAJOR number
{{{
$ cat /proc/devices
Character devices:
...
127 ttygs
...
}}}
Create a device node for the serial node
{{{
$ mknod /dev/ttygs0 c 127 0
}}}
!Install the gadget serial driver as an ACM device
{{{
$ insmod g_serial.ko use_acm=1
}}}
Plug the cable within your host
!!Install the Windows Host ACM Driver
You should install the related driver using the files [[gserial.inf]] and [[usbser.sys]] located in a folder on the Windows machine.
The Serial Gadget appears in the Device Manager in {{Ports COM & LPT}}} > {{{Gadget Serial (COMn)}}}.
!!Play with the Driver
Establish a connection with your favorite communication using the COMn above and launch on the target with an interactive session using the usb link:
{{{
$ bash --login --noprofile -i -s </dev/ttygs0 >/dev/ttygs0 2>&1
}}}
TODO... I'm not been able to test that so far
''Note:'' The properties are the following:
* Name - Gadget Serial
* Device Instance Id - {{{USB\VID_0525&PID_A4A7\0}}}
* Hardware Ids - {{{USB\Vid_0525&Pid_a4a6&Rev_021}}}
* Compatible Ids - {{{USB\Class_02&SubClass_02&Prot_01}}}
!Test the device
!Install the gadget serial driver a vendor specific in/out device
{{{
$ insmod <module_path>/g_serial.ko
}}}
Plug the cable within your host
!! Windows Host
The Serial Gadget appears in the Device Manager in {{Other devices}}} > {{{Gadget Serial}}}.
''Note:'' The properties are the following:
* Device Instance Id - {{{USB\VID_0525&PID_A4A6\0}}}
* Hardware Ids - {{{USB\Vid_0525&Pid_a4a6&Rev_021}}}
* Compatible Ids - {{{USB\Class_0a&SubClass_00&Prot_00}}}
1. Configure the USB Device Driver (UDC):
{{{
Linux Kernel Configuration
Device Drivers --->
USB Support --->
USB Gadget Support --->
[*] Support for USB Gadgets
USB Peripheral Controller (IP3503) --->
}}}
2. Configure one or more Gadgets that chould be used
** [[Ethernet Gadget|Kernel - USB driver - UDC - Ethernet Gadget]]
** [[Gadget Filesystem|Kernel - USB driver - UDC - Gadget Filesystem]]
** [[File-backed Storage Gadget|Kernel - USB driver - UDC - File-backed Storage Gadget]]
** [[Serial Gadget|Kernel - USB driver - UDC - Serial Gadget]]
!!Files
* Board Data in file {{{linux/arch/arm/mach_lpc22xx/<board>_board.c}}} as defined in file {{{linux/include/asm-arm/arch-lpc22xx/board.h}}} - see also [[add a new board|Add a new board]]
* Platform Device and Peripheral Clock definition in file {{{linux/arch/arm/mach_lpc22xx/<cpu>_cpu.c}}} - see also [[add a new cpu|Add a new cpu]]
* See also files {{{linux/arch/arm/mach_lpc22xx/Kconfig-features}}} and {{{linux/arch/arm/mach_lpc22xx/Kconfig-lpc2468}}}
* Platform Driver code in file {{{linux/drivers/usb/usb_hw.h}}}, {{{linux/drivers/usb/usb_hw.c}}} and {{{linux/drivers/usb/ea_udc.c}}}
* See also files {{{linux/drivers/usb/Kconfig}}} and {{{linux/drivers/usb/Makefile}}}
!!Platform Device and Peripheral Clock
The {{{DRIVER_NAME = "ip3503-udc"}}}
The Platform Driver requires the following resources:
** {{{IORESOURCE_MEM}}} pointing on the UDC block memory
** {{{IORESOURCE_IRQ}}} pointing on the UDC LP interrupt
** {{{IORESOURCE_IRQ}}} pointing on the UDC HP interrupt
** {{{IORESOURCE_IRQ}}} pointing on the UDC DMA interrupt
Note: a clock (with either a reference to the device or the DRIVER_NAME) is required to enable/disable the block.
!!Platform Data
There is NO related Platform Data so far.
TODO Reference to the tranceiver (pseudo-)device...
TODO Merge the ea code and ip3503 code
!Links related to USB
* [[www.usb.org|http://www.usb.org/]]
* [[USB in a Nutshell (pdf)|http://www.beyondlogic.org/usbnutshell/usb-in-a-nutshell.pdf]] - THE MUST read about USB
!Links related to USB on linux
* [[www.linux-usb.org|http://www.linux-usb.org/]]
* [[Linux-usb-users Mailing List|https://lists.sourceforge.net/lists/listinfo/linux-usb-users]]
* [[Linux-usb-devel Mailing List|https://lists.sourceforge.net/lists/listinfo/linux-usb-devel]]
* see file {{{linux/Documentation/usb/gadget_serial.txt}}} - for [[Serial Gadget|Kernel - USB driver - UDC - Serial Gadget]]
!Links related to USB on LPC family
* see [[LPC2468 User Manual|http://www.standardics.nxp.com/support/documents/microcontrollers/pdf/user.manual.lpc2468.pdf]] and [[LPC3180 User Manual|www.standardics.philips.com/support/documents/microcontrollers/pdf/user.manual.lpc3180.pdf]] - description of USB OHCI UDC, USB UDC and USB OTG (including USB I2C) blocks
* see [[Compaq OHCI Manual|ftp://ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf]]
!Wikipedia information
* http://en.wikipedia.org/wiki/USB
* http://en.wikipedia.org/wiki/USB_On-The-Go
* http://en.wikipedia.org/wiki/OHCI
* [[u-boot]] EA's NAND driver is unreliable
* [[busybox(1) - dd]] has an unpredictable behaviour
* [[busybox(1) - hexdump]] has an unpredictable behaviour when dumping files, e.g. /etc/rc
* snapgear toolchain - cannot link correctly an empty main() {} - often used to test the toolchain
* {{{__raw_readsl}}}/{{{readsl}}} and {{{__raw_writesl}}}/{{{writesl}}} functions are broken for ~LPC2XXX.
!Features
<<<
* ~ARM7TDMI-S processor, running at up to 72 ~MHz.
* 512 kB on-chip Flash program memory with ~In-System Programming (ISP) and ~In-Application Programming (IAP) capabilities. Flash program memory is on the ARM local bus for high performance CPU access.
* 98 kB on-chip SRAM includes:
** 64 kB of SRAM on the ARM local bus for high performance CPU access.
** 16 kB SRAM for Ethernet interface. Can also be used as general purpose SRAM.
** 16 kB SRAM for general purpose DMA use also accessible by the USB.
** 2 kB SRAM data storage powered from the RTC power domain
* Dual Advanced High-performance Bus (AHB) system allows simultaneous Ethernet
DMA, USB DMA, and program execution from on-chip Flash with no contention.
* EMC provides support for asynchronous static memory devices such as RAM, ROM
and Flash, as well as dynamic memories such as Single Data Rate SDRAM.
* Advanced Vectored Interrupt Controller (VIC), supporting up to 32 vectored interrupts.
* General Purpose AHB DMA controller (GPDMA) that can be used with the SSP, ~I2S, and SD/MM interface as well as for memory-to-memory transfers.
* Serial Interfaces:
** Ethernet MAC with MII/RMII interface and associated DMA controller. These functions reside on an independent AHB bus.
** USB 2.0 full-speed dual port device/host/OTG controller with on-chip PHY and associated DMA controller.
** Four ~UARTs with fractional baud rate generation, one with modem control I/O, one with ~IrDA support, all with FIFO.
** CAN controller with two channels.
** SPI controller.
** Two SSP controllers, with FIFO and multi-protocol capabilities. One is an alternate for the SPI port, sharing its interrupt. ~SSPs can be used with the GPDMA controller.
** Three ~I2C-bus interfaces (one with open-drain and two with standard port pins).
** ~I2S (~Inter-IC Sound) interface for digital audio input or output. It can be used with the GPDMA.
* Other peripherals:
** SD/MMC memory card interface.
** 160 General purpose I/O pins with configurable pull-up/down resistors.
** 10-bit ADC with input multiplexing among 8 pins.
** 10-bit DAC.
** Four general purpose timers/counters with 8 capture inputs and 10 compare outputs. Each timer block has an external count input.
** Two PWM/timer blocks with support for three-phase motor control. Each PWM has an external count inputs.
** ~Real-Time Clock (RTC) with separate power domain, clock source can be the RTC oscillator or the APB clock.
** 2 kB SRAM powered from the RTC power pin, allowing data to be stored when the rest of the chip is powered off.
** ~WatchDog Timer (WDT). The WDT can be clocked from the internal RC oscillator, the RTC oscillator, or the APB clock.
* Standard ARM test/debug interface for compatibility with existing tools.
* Emulation trace module supports real-time trace.
* Single 3.3 V power supply (3.0 V to 3.6 V).
* Four reduced power modes: idle, sleep, power-down, and deep power-down.
* Four external interrupt inputs configurable as edge/level sensitive. All pins on ~PORT0 and ~PORT2 can be used as edge sensitive interrupt sources.
* Processor wake-up from Power-down mode via any interrupt able to operate during
* Power-down mode (includes external interrupts, RTC interrupt, USB activity, Ethernet wake-up interrupt, CAN bus activity, ~PORT0/2 pin interrupt).
* Two independent power domains allow fine tuning of power consumption based on needed features.
* Each peripheral has its own clock divider for further power saving. These dividers help reducing active power by 20 - 30 %.
* Brownout detect with separate thresholds for interrupt and forced reset.
* On-chip power-on reset.
* On-chip crystal oscillator with an operating range of 1 ~MHz to 24 ~MHz.
* 4 ~MHz internal RC oscillator trimmed to 1 % accuracy that can optionally be used as the system clock. When used as the CPU clock, does not allow CAN and USB to run.
* On-chip PLL allows CPU operation up to the maximum CPU rate without the need for a high frequency crystal. May be run from the main oscillator, the internal RC oscillator, or the RTC oscillator.
* Boundary scan for simplified board testing.
* Versatile pin function selections allow more possibilities for using on-chip peripheral functions.
<<<
!See also
* [[LPC2468 Home Page|http://www.standardics.nxp.com/products/lpc2000/lpc24xx/]]
* [[LPC2468 Data Sheet|http://www.standardics.nxp.com/products/lpc2000/pdf/lpc2468.pdf]]
* [[LPC2468 User Manual|http://www.standardics.nxp.com/support/documents/microcontrollers/pdf/user.manual.lpc2468.pdf]]
* [[LPC2468 Erratasheet V1.1|http://www.standardics.nxp.com/support/documents/microcontrollers/pdf/errata.lpc2468.pdf]]
!Preliminary note
Some of the embedded peripheral designs are the same for this processor and the LPC2XXX family and a LPC3180 BSP is available!!!
!Features
<<<
* ~ARM926EJ-S processor with 32 kB instruction cache and 32 kB data cache, running at up to 208 ~MHz.
* 64 kB of SRAM.
* High-performance multi-layer AHB bus system provides a separate bus for CPU data and instruction fetch, two data buses for the DMA controller, and another for the USB controller.
* External memory interfaces: one supports DDR and SDR SDRAM, another supports single-level and multi-level NAND flash devices and can serve as an 8-bit parallel interface.
* General purpose DMA controller that can be used with the SD card and SPI interfaces, as well as for memory-to-memory transfers.
* USB 2.0 full-speed device, host (OHCI compliant), and OTG block. A dedicated PLL provides the 48 ~MHz USB clock.
* Multiple serial interfaces, including seven ~UARTs, two SPI controllers, and two single master ~I2C-bus interfaces.
* SD memory card interface.
* Up to 55 GPI, GPO, and GPIO pins. Includes 12 GPI pins, 24 GPO pins, and six GPIO pins.
* 10-bit ADC with input multiplexing from three pins.
* ~Real-Time Clock (RTC) with separate power supply and power domain, clocked by a dedicated 32 kHz oscillator. Includes a 128 byte scratch pad memory. The RTC may remain active when the rest of the chip is not powered.
* 32-bit general purpose high-speed timer with 16-bit pre-scaler with capture and compare capability.
* 32-bit millisecond timer driven from the RTC clock. Interrupts may be generated using two match registers.
* Watchdog timer.
* Two PWM blocks with an output rate up to 50 kHz.
* Keyboard scanner function provides automatic scanning of up to an 8 ´ 8 key matrix.
* Standard ARM test/debug interface for compatibility with existing tools.
* Emulation trace buffer with 2 k x 24-bit RAM allows trace via JTAG.
* On-chip crystal oscillator.
* Stop mode saves power, while allowing many peripheral functions to restart CPU activity.
* On-chip PLL allows CPU operation up to the maximum CPU rate without the need for a high frequency crystal.
* Boundary scan for simplified board testing.
<<<
!See also
* [[LPC3180 Home Page|http://www.standardics.nxp.com/products/lpc3000/lpc3180/]]
* [[LPC3180 Data Sheet|http://www.standardics.nxp.com/products/lpc3000/pdf/lpc3180.pdf]]
* [[LPC3180 User Manual|http://www.standardics.nxp.com/support/documents/microcontrollers/pdf/user.manual.lpc3180.pdf]]
* [[LPC3180 BSP|http://www.phytec.com/products/linux/bsp-LPC3180.html]] for linux 2.6.10
!Executive summary
This is a white paper explaining the various boot policies that can be used for linux. The factors influencing these policies are:
* use or not of a boot loader
* use or not of an ~eXecute In Place (XIP) kernel
* use or not of a zImage kernel
* use or not of Modules
The policy choices depend of the available and type of memories, targeted cost and expected performance as well as the development and production easiness.
Note: The root file system is independent of the adopted kernel policy. The only constrain is that the kernel shall include all driver and support required to load and/or access the root file system.
[img[title|data:image/gif;base64,R0lGODlhIgEwAfcAAAQFBIOENIKdnENEH8TETbxOHEhUVHODb6vQ0KSlQmRkJ5wGBOTkWSQkDZS2
tF5rWjxERPyENJSibHqEVumDhOSmRCUsLIKScr/q7NTTVVtsbHJzL7ympLS1RWxKNIyqoVRTHzIz
GJKUP2l5bLrh4sy2tG+EhPTzXLzCZLxmLE1UPIxWVJ6kVvwlDHB0Rk5eXI2VV/nETGFlPRMUC5uc
nD9EMR4kI4CVhdjccOHkZKLExK+0Xnx6bMzOzPzUVHyCRY2srFFUL4SFhC02M+vs7JycPszOTTw9
GGx4WkZMPNvcVnt8MpacVhMVFHmUlKutrNRSVG1sbLy8Sdve3KxubPT29H+Nb6ytRWtrL/sCBNy2
RFpcLIqlpF9VVOzrXLO3tsTExOR2NKqtWfQqLFNkZMvY2DQ9PExLHfxUI0AkFGh8fHSMjPz+ZFZc
P0hMLycsHouMN5CUTHt+S2dsP6KkpJOUlPwYDCwrFIeOWfw0FHd8fGR2ZEBNTMLFXE1aXF5ydG9z
PKy6dORiJPySPMQ+LLweDLyOjORCHJCmjOysrPxGRORydLPZ25CcbMvNZPy5RPywRPxSVGhyZJRS
NOTKVOrsZPx8MvxuLOSSlPxNHOwaHBwcDLy+XIiMR4yOjBgcHPwODPw7FHCEfKCkTAoMC1xcJNw+
PKwSBPwsFPxcJPzjWezybEhUTImVZDc7JJCcZHiLfIOOZLzm5KTKzMnKzPzaVPycPF9kNHaDZNHV
ZLC0VDA0JJykZJmdTMrNXNncZHx+PLm9VKyuZFReTIyafMTKdPyqRHx+ZJy+vC0yNISSfGx+cby+
vLRmPHx+bJSytDk+Me/y9LOytHJydN3m5Pz+/Py+TNzq7LzOzLSiPMze3F1eXPx1LNfY2PzMUGRy
XJyqcOSKjISajHR+XFxaXLK+vKSqpISalOyytK3CxPzrXNTCxGJkZPxkJPxEHISCfJu6vGd2dMK6
vPP1ZHd2dNPS1ODi5Pr6/FlcNOwyHPe6TOzubPyKNNSmpPweDICEPCH5BAAAAAAALAAAAAAiATAB
Bwj/AKsJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuX
MGPKnEmz5kca8f7k1Kkzp0+dfqIprLNkSQCjSI8qTcp0qdOmUJ9KjUp1qtWqVBXQctgDyz+sV8OC
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]]
Some comment about the policies:
# This model is the most effective for ''development''
# This model doesn't offer any advantage among the others
# This model is best suited for the ''production'' as it allows the burning of a new kernel from the kernel and the kernel can be gzipped. The disadvantage against the 1st model is that, it requires a special tool for the initial burn or a burn after failure - see [[Installing u-boot using JTAG]]
# This model is most effective from memory usage perspective, but it requires a special tool to replace the kernel by a new one
!Definition
<<<
A Linux distribution, often simply distribution or distro, is a member of the Linux family of Unix-like operating systems comprising the Linux kernel, the non-kernel parts of the GNU operating system, and assorted other software. Linux distributions take a variety of forms, from fully-featured desktop and server operating systems to minimal environments (typically for use in embedded systems, or for booting from a floppy).
<<<
[[from Wikipedia|http://en.wikipedia.org/wiki/Linux_distribution]]
!Distribution for Host
* [[Debian|http://www.debian.org/]], which as many forks
!Distribution for Embedded Linux
* [[EmDebian Slind|http://www.emdebian.org/slind.htm]]
* [[uClinux|http://www.uclinux.org/]]
* [[PTXdist - Reproducable Embedded LInux Systems|http://www.pengutronix.de/software/ptxdist/index_en.html]]
!See also
* [[Mind Map of Linux distributions|http://linuxhelp.blogspot.com/2006/04/mind-map-of-linux-distributions.html]]
* [[Embedded Linux Distributions Quick Reference Guide @ LinuxDevices.com|http://linuxdevices.com/articles/AT2760742655.html]]
* [[uClinux-dev|http://mailman.uclinux.org/mailman/listinfo/uclinux-dev]] -- uClinux development list
* [[lists.arm.linux.org.uk Mailing Lists|http://lists.arm.linux.org.uk/mailman/listinfo/]]
* [[linux-mtd|http://lists.infradead.org/mailman/listinfo/linux-mtd]] -- Linux MTD discussion mailing list
[[Welcome]]
[[Universal Boot Loader|u-boot]]
[[Kernel]]
[[Applications]]
[[Installing Linux]]
[[Using Linux]]
<script>
// tell InternetExplorer to use cached CSS background images (reduces server load)
// based on a suggestion by Bob Denny posted to the TiddlyWikiDev GoogleGroups discussion:
// http://groups.google.com/group/TiddlyWikiDev/msg/81797af532ed770f
try { document.execCommand("BackgroundImageCache", false, true); } catch(err) {;}
</script>
<style type="text/css">
#contentWrapper {display:none;}
body { background:#eee; }
</style>
<div id="SplashScreen" style="border: 1px solid #ccc; -moz-border-radius:1em; display:block; text-align:center; width:400px; margin:100px auto; padding:.5em; color:#fff; font-size:24pt; font-family:verdana,arial,helvetica,sans; background-color:#006;">
uClinux for LPC2468<br/>
<img src='data:image/gif;base64,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'/>
<div style="font-size: 18px; color:#fff;">please wait...</div>
</div>
!u-boot running
|{{{00000000 - 0002FFFF}}}|u-boot application|
|{{{0007C000 - 0007CFFF}}}|u-boot environment|
|{{{40000100 - 4000xxxx}}}|u-boot bootargs to kernel on bootm|
|{{{A1F00000 - A1FFFFFF}}}|u-boot image in memory|
!kernel running
|{{{00000000 - 0000003F}}}|interrupt vectors (remapped from SRAM)|
|{{{40000000 - 4000003F}}}|interrupt vectors|
|{{{4000FEE0 - 4000FFDF}}}|IAP buffer - used by [[MTD Internal Flash Driver|Internal Flash driver]]|
|{{{4000FFE0 - 4000FFFF}}}|IAP memory - used by [[MTD Internal Flash Driver|Internal Flash driver]]|
|{{{A0008000 - A0207FFF}}}|kernel image (up to 2MB)|
|{{{A1800000 - A1BFFFFF}}}|romfs image (up to 4MB - see initrd kernel parameter)|
! [[MCI|Kernel - MCI driver]] interface
The design has to consider this:
* Don't use ~MCIDAT0 on port P1.6. This disables MDC communication with the Ethernet RMII
* Connect the MMC Write Protect output (WP#) signal to a GPIO
* Connect the MMC Card Detect output (CD#) signal to a GPIO on Port 0 or Port 2
! [[ETH|Kernel - ETH driver]] interface
The design has to consider this:
* If the MII/RMII has a Power Down input (e.g. PD#) then connect it to a GPIO, if you want to power down Ethernet (see PM)
! [[USB|Kernel - USB driver]] interface
* An internal USB clock of 48MHz is required, in fact 96MHz/2, which give the following choices for the {{{clk_pllclk}}}: 288MHz, 384MHz and 480MHz to remain in the range [275MHz-550MHz].
You can read an article about the various [[Linux Booting policies]]
!MAC Address
For every ethernet device (real or virtual), you shall assign an unique MAC address. One is required for the [[Ethernet port|Kernel - ETH driver]]. Two are required for the [[USB Ethernet Gadget|Kernel - USB driver - UDC - Ethernet Gadget]].
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div id='contentFooter' refresh='content' tiddler='contentFooter'></div>
</div>
<!--}}}-->
an [[uClinux|http://www.uclinux.org/]] fork
[img[title|data:image/gif;base64,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]] [[uClinux|http://www.uClinux.org]] for [[LPC22XX]]
/***
''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''
|Name|SplashScreenPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#SplashScreenPlugin|
|Version|0.21 |
|Requires|~TW2.08+|
!Description:
Provides a simple splash screen that is visible while the TW is loading.
!Installation
Copy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.
!Customizing
Once the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.
!History
* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.
* 26-06-06 : version 0.2, first release
!Code
***/
//{{{
window.old_lewcid_splash_restart=window.restart;
window.restart = function()
{ if (document.getElementById("SplashScreen"))
document.getElementById("SplashScreen").style.display = "none";
if (document.getElementById("contentWrapper"))
document.getElementById("contentWrapper").style.display = "block";
window.old_lewcid_splash_restart();
if (splashScreenInstall)
{if(config.options.chkAutoSave)
{saveChanges();}
displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");
}
}
var oldText = store.getTiddlerText("MarkupPreHead");
if (oldText.indexOf("SplashScreen")==-1)
{var siteTitle = store.getTiddlerText("SiteTitle");
var splasher='\n\n<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';
if (! store.tiddlerExists("MarkupPreHead"))
{var myTiddler = store.createTiddler("MarkupPreHead");}
else
{var myTiddler = store.getTiddler("MarkupPreHead");}
myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);
store.setDirty(true);
var splashScreenInstall = true;
}
//}}}
/*{{{*/
.ckecklistOkClass {color: green}
.checklistTestClass {color: darkgreen}
.checklistTodoClass {color: orange}
.checklistUpdateClass {color: orange}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}
body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}
h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}
hr {height:1px;}
a {text-decoration:none;}
dt {font-weight:bold;}
ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}
.txtOptionInput {width:11em;}
#contentWrapper .chkOptionInput {border:0;}
.externalLink {text-decoration:underline;}
.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}
.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}
/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}
#mainMenu .tiddlyLinkExisting,
#mainMenu .tiddlyLinkNonExisting,
#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}
.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:1em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:1em 0em 1em 1em; left:0px; top:0px;}
.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}
#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}
#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}
.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}
#messageArea {position:absolute; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:200;}
*[id='messageArea'] {position:fixed !important; z-index:200;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}
.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}
.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}
.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}
#contentWrapper {display:block;}
#splashScreen {display:none;}
#displayArea {margin:1em 17em 0em 14em;}
.toolbar {text-align:right; font-size:.9em;}
.tiddler {padding:1em 1em 0em 1em;}
.missing .viewer,.missing .title {font-style:italic;}
.title {font-size:1.6em; font-weight:bold;}
.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}
.tiddler .button {padding:0.2em 0.4em;}
.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}
.footer {font-size:.9em;}
.footer li {display:inline;}
.annotation {padding:0.5em; margin:0.5em;}
* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}
table {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}
.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}
.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}
.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}
.sparkline {line-height:1em;}
.sparktick {outline:0;}
.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}
* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:50; position:absolute; width:100%; height:100px;}
.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
#contentFooter {
text-align: center;
clear: both;
color:#fff;
background: black;
padding: 1em 2em;
font-weight:bold;
}
/*}}}*/
* LPC2468 tech.groups.yahoo.com
* LPC2200
!Sources
* [[kernel.org|http://www.kernel.org/]] -- The Linux Kernel Archives
* [[lxr.free-electrons.com|http://lxr.free-electrons.com/]] -- ~Cross-Referencing Linux 2.6.21, 2.6.20, 2.6.19, 2.6.18, 2.6.17, 2.6.16, 2.6.15, 2.6.14
* [[lxr.linux.no|http://lxr.linux.no/]] -- ~Cross-Referencing Linux 2.6.20.1, 2.6.18, 2.6.17.13, 2.6.11, 2.6.10
* [[www.gelato.unsw.edu.au|http://www.gelato.unsw.edu.au/lxr/]] -- ~Cross-Referencing Linux 2.6.17, 2.6.16
* [[fxr.watson.org|http://fxr.watson.org/fxr/source/?v=linux-2.6]] -- ~Cross-Referencing FreeBSD/Linux Kernel Cross Reference (2.6)
* [[tomoyo.sourceforge.jp|http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/]] -- ~Cross-Referencing TOMOYO Linux 2.6.21.3
* [[www.uClinux.org|http://www.uclinux.org/]] -- uClinux
* [[www.uClibc.org|http://www.uclibc.org/]] -- uClibc
* [[www.busybox.net|http://www.busybox.net/]] - busybox
* [[opensrc.sec.samsung.com|http://opensrc.sec.samsung.com/]] - Linux 2.6 for ~MMU-less ARM Project
* [[Blackfin uClinux wiki|http://docs.blackfin.uclinux.org/doku.php]] -- Blackfin Linux Docs
!Portals
* [[uCdot.org|http://www.ucdot.org/]] -- Embedded Linux and uClinux Developer Forum
* [[ARM Linux|http://www.arm.linux.org.uk]] -- Linux for all ARM based machines
* http://www.linuxdevices.com/
!Tools
* GNU ARM
!IDE
* eclipse
* CDT
* embeddedCDT
!Hardware
* ARM
* NXP
* Samsung (S3 family)
* ATMEL (AT91 family based on ARM9TDMI)
!Companies
* Embedded Artists
* pragmatel
!Documentation around embedded Linux
* https://linuxlink.timesys.com/doc/
Welcome to this [[TiddlyWiki|http://www.tiddlywiki.com]], which presents the Linux for LPC22XX a "fork" of [[uClinux|http://www.uclinux.org]] an [[Embedded Linux Distribution|Linux Distributions]].
News:
- There is an article about the various [[Linux Booting policies]]...
You can build all from scratch following these steps:
#[[Host]]
#[[uClinux]]
##[[Universal Boot Loader|Bootloader - u-boot]]
##[[Kernel]], [[man pages]]
##[[Applications]]
#[[Installing Linux]]
#[[Using Linux]]
#[[Developing an application using Eclipse]]
Summary on driver availability:
- [[UART|Kernel - UART driver]], [[ETH|Kernel - ETH driver]], [[MCI|Kernel - MCI driver]], [[MTD|Kernel - MTD driver]], [[RTC|Kernel - RTC driver]], [[BRAM|Kernel - BRAM driver]], [[USB Host|Kernel - USB driver - HDC OHCI]], [[USB Device|Kernel - USB driver - UDC]], [[GPIO|Kernel - GPIO driver]], [[ADC|Kernel - ADC driver]], [[DAC|Kernel - DAC driver]], [[I2C|Kernel - I2C driver]], [[SPI|Kernel - SPI driver]], [[SSP|Kernel - SSP driver]]
>''Note:''
>- [[MTD|Kernel - MTD driver]] are available: for the Internal Flash, for NOR Flash (only V1.1 board) and NAND Flash of the Embedded Artists' LPC2468 OEM Board
>--- You can have only USB Host ''OR'' USB Device in a kernel at a time, not both!!!---
Which drivers are planned:
- {{{USB On-The-Go}}}, {{{CAN}}}, {{{TIMER}}}, {{{PWM}}}, {{{IRDA}}}
>''Note:''
>- {{{TIMER0}}} is already used as "timer tick"
>- You can have only USB Host ''OR'' USB Device in a kernel at a time, not both!!!
There are even more detailed information here:
[[Hacker Corner]]
[[Note for the hardware designer]]
[[Note for the software designer]]
[[Known bugs & issues]]
!Links
[[Web Sites]]
[[User Groups]]
[[Mailing Lists]]
<<<
!~BusyBox: The Swiss Army Knife of Embedded Linux
~BusyBox combines tiny versions of many common UNIX utilities into a single small executable. It provides replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc. The utilities in ~BusyBox generally have fewer options than their full-featured GNU cousins; however, the options that are included provide the expected functionality and behave very much like their GNU counterparts. ~BusyBox provides a fairly complete environment for any small or embedded system.
<<<
!Web Sites / User Groups / Mailing Lists
*http://busybox.net/ -- Home of busybox
*http://busybox.net/downloads/ -- Source repository
*http://busybox.net/cgi-bin/mailman/listinfo/busybox -- Mailing list
*http://busybox.net/cgi-bin/viewcvs.cgi/trunk/busybox/ -- Source browsing
!Notes
[[busybox(1) - login]] requires the files /etc/group, /etc/passwd and optionally /etc/shadow.
!See also
[[Man busybox(1)|busybox(1)]]
[[Building busybox]]
(C) Copyright 2007 Siemens Builting Technologies - Maintainer [[Philippe Goetz|mailto:philippe.goetz@siemens.com]]
!Create the diff file for publication
Note: myApplication includes the root name of application and the version number (major.minor.release or date), e.g. {{{busybox-1.5.1}}}.
* Be shure to have the reference application in a directory, e.g. {{{myApplication-orig}}}, if not do the following:
** Move the modified application in a new directory, e.g. {{{mv myApplication myApplication-new}}}
** Untar the reference tarball, e.g. {{{tar zxvf myApplication.tar.gz}}} or {{{tar jxvf myApplication.tar.bz2}}}
** Move the reference application in a orig directory, e.g. {{{mv myApplication myApplication-orig}}}
** Move the new application in the directory, e.g. {{{mv myApplication-new myApplication}}}
* Remove all intermediate files, e.g. {{{make -C myApplication -f Makefile.uclinux clean}}}. Don't remove important configuration files, which is not automatically built during the make.
* Create the diff file, e.g. {{{diff -urbN myApplication-orig myApplication >myApplication.patch}}}
!How to use the patch
* Untar the reference tarball, e.g. {{{tar zxvf myApplication.tar.gz}}} or {{{tar jxvf myApplication.tar.bz2}}}
* Apply the patch file, e.g. {{{patch -p0 <myApplication.diff}}}
libssl is base on the [[OpenSSL|http://www.openssl.org/]].
TODO...
[[Building OpenSSL]]
!NAME
~BusyBox - The Swiss Army Knife of Embedded Linux
!SYNTAX
{{{
BusyBox <function> [arguments...] # or
<function> [arguments...] # if symlinked
}}}
!DESCRIPTION
~BusyBox combines tiny versions of many common UNIX utilities into a single
small executable. It provides minimalist replacements for most of the utilities
you usually find in fileutils, shellutils, findutils, textutils, grep, gzip,
tar, etc. ~BusyBox provides a fairly complete POSIX environment for any small
or embedded system. The utilities in ~BusyBox generally have fewer options than
their full-featured GNU cousins; however, the options that are included provide
the expected functionality and behave very much like their GNU counterparts.
~BusyBox has been written with size-optimization and limited resources in mind.
It is also extremely modular so you can easily include or exclude commands (or
features) at compile time. This makes it easy to customize your embedded
systems. To create a working system, just add a kernel, a shell (such as ash),
and an editor (such as elvis-tiny or ae).
!USAGE
When you create a link to ~BusyBox for the function you wish to use, when ~BusyBox
is called using that link it will behave as if the command itself has been invoked.
For example, entering
{{{
ln -s ./BusyBox ls
./ls
}}}
will cause ~BusyBox to behave as 'ls' (if the 'ls' command has been compiled
into ~BusyBox).
You can also invoke ~BusyBox by issuing the command as an argument on the
command line. For example, entering
{{{
./BusyBox ls
}}}
will also cause ~BusyBox to behave as 'ls'.
!COMMON OPTIONS
Most ~BusyBox commands support the {{{--help}}} option to provide a
terse runtime description of their behavior.
!COMMANDS
Currently defined functions include:
[[ar|man - busybox(1) - ar]], [[basename|man - busybox(1) - basename]], [[cat|man - busybox(1) - cat]], [[chgrp|man - busybox(1) - chgrp]], [[chmod|man - busybox(1) - chmod]], [[chown|man - busybox(1) - chown]], [[chroot|man - busybox(1) - chroot]], [[chvt|man - busybox(1) - chvt]], [[clear|man - busybox(1) - clear]], [[cp|man - busybox(1) - cp]], [[cut|man - busybox(1) - cut]], [[date|man - busybox(1) - date]], [[dc|man - busybox(1) - dc]],
[[dd|man - busybox(1) - dd]], [[deallocvt|man - busybox(1) - deallocvt]], [[df|man - busybox(1) - df]], [[dirname|man - busybox(1) - dirname]], [[dmesg|man - busybox(1) - dmesg]], [[dos2unix|man - busybox(1) - dos2unix]], [[du|man - busybox(1) - du]], [[dumpkmap|man - busybox(1) - dumpkmap]], [[dutmp|man - busybox(1) - dutmp]], [[echo|man - busybox(1) - echo]], [[false|man - busybox(1) - false]],
[[fbset|man - busybox(1) - fbset]], [[fdflush|man - busybox(1) - fdflush]], [[find|man - busybox(1) - find]], [[free|man - busybox(1) - free]], [[freeramdisk|man - busybox(1) - freeramdisk]], [[fsck.minix|man - busybox(1) - fsck minix]], [[getopt|man - busybox(1) - getopt]], [[grep|man - busybox(1) - grep]], [[gunzip|man - busybox(1) - gunzip]],
[[gzip|man - busybox(1) - gzip]], [[halt|man - busybox(1) - halt]], [[head|man - busybox(1) - head]], [[hostid|man - busybox(1) - hostid]], [[hostname|man - busybox(1) - hostname]], [[id|man - busybox(1) - id]], [[init|man - busybox(1) - init]], [[insmod|man - busybox(1) - insmod]], [[kill|man - busybox(1) - kill]], [[killall|man - busybox(1) - killall]], [[length|man - busybox(1) - length]],
[[ln|man - busybox(1) - ln]], [[loadacm|man - busybox(1) - loadacm]], [[loadfont|man - busybox(1) - loadfont]], [[loadkmap|man - busybox(1) - loadkmap]], [[logger|man - busybox(1) - logger]], [[logname|man - busybox(1) - logname]], [[ls|man - busybox(1) - ls]], [[lsmod|man - busybox(1) - lsmod]], [[makedevs|man - busybox(1) - makedevs]], [[mkdir|man - busybox(1) - mkdir]],
[[mkfifo|man - busybox(1) - mkfifo]], [[mkfs.minix|man - busybox(1) - mkfs minix]], [[mknod|man - busybox(1) - mknod]], [[mkswap|man - busybox(1) - mkswap]], [[mktemp|man - busybox(1) - mktemp]], [[more|man - busybox(1) - more]], [[mount|man - busybox(1) - mount]], [[mt|man - busybox(1) - mt]], [[mv|man - busybox(1) - mv]], [[nc|man - busybox(1) - nc]], [[nslookup|man - busybox(1) - nslookup]],
[[ping|man - busybox(1) - ping]], [[poweroff|man - busybox(1) - poweroff]], [[printf|man - busybox(1) - printf]], [[ps|man - busybox(1) - ps]], [[pwd|man - busybox(1) - pwd]], [[rdate|man - busybox(1) - rdate]], [[reboot|man - busybox(1) - reboot]], [[renice|man - busybox(1) - renice]], [[reset|man - busybox(1) - reset]], [[rm|man - busybox(1) - rm]], [[rmdir|man - busybox(1) - rmdir]],
[[rmmod|man - busybox(1) - rmmod]], [[sed|man - busybox(1) - sed]], [[setkeycodes|man - busybox(1) - setkeycodes]], [[sh|man - busybox(1) - sh]], [[sleep|man - busybox(1) - sleep]], [[sort|man - busybox(1) - sort]], [[swapoff|man - busybox(1) - swapoff]], [[swapon|man - busybox(1) - swapon]], [[sync|man - busybox(1) - sync]], [[syslogd|man - busybox(1) - syslogd]], [[tail|man - busybox(1) - tail]],
[[tar|man - busybox(1) - tar]], [[tee|man - busybox(1) - tee]], [[telnet|man - busybox(1) - telnet]], [[test|man - busybox(1) - test]], [[touch|man - busybox(1) - touch]], [[tr|man - busybox(1) - tr]], [[true|man - busybox(1) - true]], [[tty|man - busybox(1) - tty]], [[umount|man - busybox(1) - umount]], [[uname|man - busybox(1) - uname]], [[uniq|man - busybox(1) - uniq]], [[unix2dos|man - busybox(1) - unix2dos]],
[[unrpm|man - busybox(1) - unrpm]], [[update|man - busybox(1) - update]], [[uptime|man - busybox(1) - uptime]], [[usleep|man - busybox(1) - usleep]], [[uudecode|man - busybox(1) - uudecode]], [[uuencode|man - busybox(1) - uuencode]], [[wc|man - busybox(1) - wc]], [[which|man - busybox(1) - which]], [[whoami|man - busybox(1) - whoami]], [[yes|man - busybox(1) - yes]],
[[zcat|man - busybox(1) - zcat]], [[ [|man - busybox(1) - []]
!LIBC NSS
GNU Libc uses the Name Service Switch (NSS) to configure the behavior of the C
library for the local environment, and to configure how it reads system data,
such as passwords and group information. ~BusyBox has made it Policy that it
will never use NSS, and will never use and libc calls that make use of NSS.
This allows you to run an embedded system without the need for installing an
/etc/nsswitch.conf file and without and /lib/libnss_* libraries installed.
If you are using a system that is using a remote LDAP server for authentication
via GNU libc NSS, and you want to use ~BusyBox, then you will need to adjust the
~BusyBox source. Chances are though, that if you have enough space to install
of that stuff on your system, then you probably want the full GNU utilities.
!SEE ALSO
textutils(1), shellutils(1), etc...
!MAINTAINER
Erik Andersen <andersee@debian.org> <andersen@lineo.com>
!AUTHORS
The following people have contributed code to ~BusyBox whether
they know it or not.
*Erik Andersen <andersee@debian.org>
*John Beppu <beppu@lineo.com>
*Brian Candler <B.Candler@pobox.com>
*Randolph Chung <tausq@debian.org>
*Dave Cinege <dcinege@psychosis.com>
*Karl M. Hegbloom <karlheg@debian.org>
*John Lombardo <john@deltanet.com>
*Glenn McGrath <bug1@netconnect.com.au>
*Bruce Perens <bruce@perens.com>
*Pavel Roskin <proski@gnu.org>
*Linus Torvalds <torvalds@transmeta.com>
*Mark Whitley <markw@lineo.com>
*Charles P. Wright <cpwright@villagenet.com>
*Enrique Zanardi <ezanardi@ull.es>
''Usage:'' {{{ar [optxvV] archive [filenames]}}}
Extract or list files from an ar archive.
''Options:''
|{{{o}}}|preserve original dates|
|{{{p}}}|extract to stdout|
|{{{t}}}|list|
|{{{x}}}|extract|
|{{{v}}}|verbosely list files processed|
''Usage:'' {{{{{{basename FILE [SUFFIX]}}}}}}
Strips directory path and suffixes from FILE.
If specified, also removes any trailing SUFFIX.
''Example:''
{{{
$ basename /usr/local/bin/foo
foo
$ basename /usr/local/bin/
bin
$ basename /foo/bar.txt .txt
bar
}}}
''Usage:'' {{{cat [FILE ...]}}}
Concatenates FILE(s) and prints them to the standard output.
''Example:''
{{{
$ cat /proc/uptime
110716.72 17.67
}}}
''Usage:'' {{{chgrp [OPTION]... GROUP FILE...}}}
Change the group membership of each FILE to GROUP.
''Options:''
|{{{-R}}}|change files and directories recursively|
''Example:''
{{{
$ ls -l /tmp/foo
-r--r--r-- 1 andersen andersen 0 Apr 12 18:25 /tmp/foo
$ chgrp root /tmp/foo
$ ls -l /tmp/foo
-r--r--r-- 1 andersen root 0 Apr 12 18:25 /tmp/foo
}}}
''Usage:'' {{{tr [-cds] STRING1 [STRING2]}}}
Translate, squeeze, and/or delete characters from
standard input, writing to standard output.
''Options:''
|{{{-c}}}|take complement of STRING1|
|{{{-d}}}|delete input characters coded STRING1|
|{{{-s}}}|squeeze multiple output characters of STRING2 into one character|
''Example:''
{{{
$ echo "gdkkn vnqkc" | tr [a-y] [b-z]
hello world
}}}
''Usage:'' {{{true}}}
Returns an exit code of TRUE (0)
''Example:''
{{{
$ true
$ echo $?
0
}}}
''Usage:'' {{{tty}}}
Print the file name of the terminal connected to standard input.
''Options:''
|{{{-s}}}|print nothing, only return an exit status|
''Example:''
{{{
$ tty
/dev/tty2
}}}
''Usage:'' {{{umount [flags] filesystem|directory}}}
Flags:
|{{{-a}}}|Unmount all file systems|
|{{{-r}}}|Try to remount devices as read-only if mount is busy|
|{{{-f}}}|Force filesystem umount (i.e. unreachable NFS server)|
|{{{-l}}}|Do not free loop device (if a loop device has been used)|
''Example:''
{{{
$ umount /dev/hdc1
}}}
''Usage:'' {{{uname [OPTION]...}}}
Print certain system information. With no OPTION, same as B<-s>.
''Options:''
|{{{-a}}}|print all information|
|{{{-m}}}|the machine (hardware) type|
|{{{-n}}}|print the machine's network node hostname|
|{{{-r}}}|print the operating system release|
|{{{-s}}}|print the operating system name|
|{{{-p}}}|print the host processor type|
|{{{-v}}}|print the operating system version|
''Example:''
{{{
$ uname -a
Linux debian 2.2.15pre13 #5 Tue Mar 14 16:03:50 MST 2000 i686 unknown
}}}
''Usage:'' {{{uniq [OPTION]... [INPUT [OUTPUT]]}}}
Discard all but one of successive identical lines from INPUT (or standard input), writing to OUTPUT (or standard output).
''Example:''
{{{
$ echo -e "a\na\nb\nc\nc\na" | sort | uniq
a
b
c
}}}
''Usage:'' {{{unix2dos < unixfile > dosfile}}}
Converts a text file from unix format to dos format.
''Usage:'' {{{unrpm < package.rpm | gzip B<-d> | cpio -idmuv}}}
Extracts an rpm archive.
''Usage:'' {{{update [options]}}}
Periodically flushes filesystem buffers.
''Options:''
|{{{-S }}}|force use of sync(2) instead of flushing|
|{{{-s SECS}}}|call sync this often (default 30)|
|{{{-f SECS}}}|flush some buffers this often (default 5)|
''Usage:'' {{{uptime}}}
Tells how long the system has been running since boot.
''Example:''
{{{
$ uptime
1:55pm up 2:30, load average: 0.09, 0.04, 0.00
}}}
''Usage:'' {{{usleep N}}}
Pauses for N microseconds.
''Example:''
{{{
$ usleep 1000000
[pauses for 1 second]
}}}
''Usage:'' {{{uudecode [OPTION] [FILE]}}}
Uudecode a uuencoded file
''Options:''
|{{{-o FILE}}}|direct output to FILE|
''Example:''
{{{
$ uudecode -o BusyBox BusyBox.uu
$ ls -l BusyBox
-rwxr-xr-x 1 ams ams 245264 Jun 7 21:35 BusyBox
}}}
''Usage:'' {{{wc [OPTION]... [FILE]...}}}
Print line, word, and byte counts for each FILE, and a total line if
more than one FILE is specified. With no FILE, read standard input.
''Options:''
|{{{-c}}}|print the byte counts|
|{{{-l}}}|print the newline counts|
|{{{-L}}}|print the length of the longest line|
|{{{-w}}}|print the word counts|
''Example:''
{{{
$ wc /etc/passwd
31 46 1365 /etc/passwd
}}}
''Usage:'' {{{which [COMMAND ...]}}}
Locates a COMMAND.
''Example:''
{{{
$ which login
/bin/login
}}}
''Usage:'' {{{whoami}}}
Prints the user name associated with the current effective user id.
''Example:''
{{{
$ whoami
andersen
}}}
''Usage:'' {{{yes [OPTION]... [STRING]...}}}
Repeatedly outputs a line with all specified STRING(s), or `y'.
This is essentially an alias for invoking "gunzip B<-c>", where it decompresses the file in question and send the output to stdout.
Stunnel-4.20 Man Page
!NAME
stunnel - universal SSL tunnel
!SYNOPSIS
{{{
stunnel [<filename>] | -fd n | -help | -version | -sockets
}}}
!DESCRIPTION
The stunnel program is designed to work as SSL encryption wrapper between remote clients and local (inetd-startable) or remote servers. The concept is that having non-SSL aware daemons running on your system you can easily set them up to communicate with clients over secure SSL channels.
stunnel can be used to add SSL functionality to commonly used Inetd daemons like ~POP-2, ~POP-3, and IMAP servers, to standalone daemons like NNTP, SMTP and HTTP, and in tunneling PPP over network sockets without changes to the source code.
This product includes cryptographic software written by Eric Young (eay@cryptsoft.com)
!OPTIONS
''{{{<filename>}}}''
>Use specified configuration file
''{{{-fd n}}}''
>Read the config file from specified file descriptor
''{{{-help}}}''
>Print stunnel help menu
''{{{-version}}}''
>Print stunnel version and compile time defaults
''{{{-sockets}}}''
>Print default socket options
!CONFIGURATION FILE
Each line of the configuration file can be either:
* an empty line (ignored)
* a comment starting with ';' (ignored)
* an 'option_name = option_value' pair
* '[service_name]' indicating a start of a service definition
!!GLOBAL OPTIONS
''{{{chroot = directory}}}''
<<<
directory to chroot stunnel process
chroot keeps stunnel in chrooted jail. CApath, CRLpath, pid and exec are located inside the jail and the patches have to be relative to the directory specified with chroot.
To have libwrap (TCP Wrappers) control effective in a chrooted environment you also have to copy its configuration files (/etc/hosts.allow and /etc/hosts.deny) there.
<<<
''{{{compression = zlib | rle}}}''
<<<
select data compression algorithm
default: no compression
<<<
''{{{debug = [facility.]level}}}''
<<<
debugging level
Level is a one of the syslog level names or numbers emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), or debug (7). All logs for the specified level and all levels numerically less than it will be shown. Use debug = debug or debug = 7 for greatest debugging output. The default is notice (5).
The syslog facility 'daemon' will be used unless a facility name is supplied. (Facilities are not supported on Win32.)
Case is ignored for both facilities and levels.
<<<
''{{{EGD = egd path}}}''
<<<
path to Entropy Gathering Daemon socket
Entropy Gathering Daemon socket to use to feed OpenSSL random number generator. (Available only if compiled with OpenSSL 0.9.5a or higher)
<<<
engine = auto | <engine id>
<<<
select hardware engine
default: software-only cryptography
There's an example in 'EXAMPLES' section.
<<<
engineCtrl = command[:parameter]
<<<
control hardware engine
Special commands ``LOAD'' and ``INIT'' can be used to load and initialize the engine cryptogaphic module.
<<<
foreground = yes | no (Unix only)
<<<
foreground mode
Stay in foreground (don't fork) and log to stderr instead of via syslog (unless output is specified).
default: background in daemon mode
<<<
output = file
<<<
append log messages to a file instead of using syslog
/dev/stdout device can be used to redirect log messages to the standard output (for example to log them with daemontools splogger).
<<<
pid = file (Unix only)
<<<
pid file location
If the argument is empty, then no pid file will be created.
pid path is relative to chroot directory if specified.
<<<
RNDbytes = bytes
<<<
bytes to read from random seed files
Number of bytes of data read from random seed files. With SSL versions less than 0.9.5a, also determines how many bytes of data are considered sufficient to seed the PRNG. More recent OpenSSL versions have a builtin function to determine when sufficient randomness is available.
<<<
RNDfile = file
<<<
path to file with random seed data
The SSL library will use data from this file first to seed the random number generator.
<<<
RNDoverwrite = yes | no
<<<
overwrite the random seed files with new random data
default: yes
<<<
service = servicename
<<<
use specified string as the service name
On Unix: inetd mode service name for TCP Wrapper library.
On NT/2000/XP: NT service name in the Control Panel.
default: stunnel
<<<
setgid = groupname (Unix only)
<<<
setgid() to groupname in daemon mode and clears all other groups
<<<
setuid = username (Unix only)
<<<
setuid() to username in daemon mode
<<<
socket = a|l|r:option=value[:value]
<<<
Set an option on accept/local/remote socket
The values for linger option are l_onof:l_linger. The values for time are tv_sec:tv_usec.
Examples:
<<<
socket = l:SO_LINGER=1:60
set one minute timeout for closing local socket
socket = r:TCP_NODELAY=1
turn off the Nagle algorithm for remote sockets
socket = r:SO_OOBINLINE=1
place out-of-band data directly into the
receive data stream for remote sockets
socket = a:SO_REUSEADDR=0
disable address reuse (enabled by default)
socket = a:SO_BINDTODEVICE=lo
only accept connections on loopback interface
<<<
<<<
!!SERVICE-LEVEL OPTIONS
Each configuration section begins with service name in square brackets. The service name is used for libwrap (TCP Wrappers) access control and lets you distinguish stunnel services in your log files.
Note that if you wish to run stunnel in inetd mode (where it is provided a network socket by a server such as inetd, xinetd, or tcpserver) then you should read the section entitled INETD MODE below.
accept = [host:]port
<<<
accept connections on specified host:port
If no host specified, defaults to all IP addresses for the local host.
<<<
CApath = directory
<<<
Certificate Authority directory
This is the directory in which stunnel will look for certificates when using the verify. Note that the certificates in this directory should be named XXXXXXXX.0 where XXXXXXXX is the hash value of the DER encoded subject of the cert (the first 4 bytes of the MD5 hash in least significant byte order).
CApath path is relative to chroot directory if specified.
<<<
CAfile = certfile
<<<
Certificate Authority file
This file contains multiple CA certificates, used with the verify.
<<<
cert = pemfile
<<<
certificate chain PEM file name
A PEM is always needed in server mode. Specifying this flag in client mode will use this certificate chain as a client side certificate chain. Using client side certs is optional. The certificates must be in PEM format and must be sorted starting with the certificate to the highest level (root CA).
<<<
ciphers = cipherlist
<<<
Select permitted SSL ciphers
A colon delimited list of the ciphers to allow in the SSL connection. For example DES-CBC3-SHA:IDEA-CBC-MD5
<<<
client = yes | no
<<<
client mode (remote service uses SSL)
default: no (server mode)
<<<
connect = [host:]port
<<<
connect to remote host:port
If no host specified, defaults to localhost.
<<<
CRLpath = directory
<<<
Certificate Revocation Lists directory
This is the directory in which stunnel will look for CRLs when using the verify. Note that the CRLs in this directory should be named XXXXXXXX.0 where XXXXXXXX is the hash value of the CRL.
CRLpath path is relative to chroot directory if specified.
<<<
CRLfile = certfile
<<<
Certificate Revocation Lists file
This file contains multiple CRLs, used with the verify.
<<<
delay = yes | no
<<<
delay DNS lookup for 'connect' option
<<<
engineNum = engine number
<<<
select engine number to read private key
The engines are numbered starting from 1.
<<<
exec = executable_path (Unix only)
<<<
execute local inetd-type program
exec path is relative to chroot directory if specified.
<<<
execargs = $0 $1 $2 ... (Unix only)
<<<
arguments for exec including program name ($0)
Quoting is currently not supported. Arguments are separated with arbitrary number of whitespaces.
<<<
ident = username
<<<
use IDENT (RFC 1413) username checking
<<<
key = keyfile
<<<
private key for certificate specified with cert option
Private key is needed to authenticate certificate owner. Since this file should be kept secret it should only be readable to its owner. On Unix systems you can use the following command:
chmod 600 keyfile
default: value of cert option
<<<
local = host
<<<
IP of the outgoing interface is used as source for remote connections. Use this option to bind a static local IP address, instead.
<<<
OCSP = url
<<<
select OCSP server for certificate verification
<<<
OCSPflag = flag
<<<
specify OCSP server flag
Several OCSPflag can be used to specify multiple flags.
currently supported flags: NOCERTS, NOINTERN NOSIGS, NOCHAIN, NOVERIFY, NOEXPLICIT, NOCASIGN, NODELEGATED, NOCHECKS, TRUSTOTHER, RESPID_KEY, NOTIME
<<<
options = SSL_options
OpenSSL library options
The parameter is the OpenSSL option name as described in the SSL_CTX_set_options(3ssl) manual, but without SSL_OP_ prefix. Several options can be used to specify multiple options.
For example for compatibility with erroneous Eudora SSL implementation the following option can be used:
options = DONT_INSERT_EMPTY_FRAGMENTS
protocol = proto
application protocol to negotiate SSL
currently supported: cifs, connect, imap, nntp, pop3, smtp
protocolAuthentication = auth_type
authentication type for protocol negotiations
currently supported: basic, NTLM
Currently authentication type only applies to 'connect' protocol.
default: basic
protocolHost = host:port
destination address for protocol negotiations
protocolPassword = password
password for protocol negotiations
protocolUsername = username
username for protocol negotiations
pty = yes | no (Unix only)
allocate pseudo terminal for 'exec' option
retry = yes | no (Unix only)
reconnect a connect+exec section after it's disconnected
default: no
session = timeout
session cache timeout
sslVersion = version
select version of SSL protocol
Allowed options: all, SSLv2, SSLv3, TLSv1
TIMEOUTbusy = seconds
time to wait for expected data
TIMEOUTclose = seconds
time to wait for close_notify (set to 0 for buggy MSIE)
TIMEOUTconnect = seconds
time to wait to connect a remote host
TIMEOUTidle = seconds
time to keep an idle connection
transparent = yes | no (Unix only)
transparent proxy mode
Re-write address to appear as if wrapped daemon is connecting from the SSL client machine instead of the machine running stunnel. This option is only available in local mode (exec option) by LD_PRELOADing env.so shared library or in remote mode (connect option) on Linux 2.2 kernel compiled with transparent proxy option and then only in server mode. Note that this option will not combine with proxy mode (connect) unless the client's default route to the target machine lies through the host running stunnel, which cannot be localhost.
verify = level
verify peer certificate
level 1 - verify peer certificate if present
level 2 - verify peer certificate
level 3 - verify peer with locally installed certificate
default - no verify
!RETURN VALUE
stunnel returns zero on success, non-zero on error.
!EXAMPLES
In order to provide SSL encapsulation to your local imapd service, use
{{{
[imapd]
accept = 993
exec = /usr/sbin/imapd
execargs = imapd
}}}
If you want to provide tunneling to your pppd daemon on port 2020, use something like
{{{
[vpn]
accept = 2020
exec = /usr/sbin/pppd
execargs = pppd local
pty = yes
}}}
If you want to use stunnel in inetd mode to launch your imapd process, you'd use this stunnel.conf. Note there must be no [service_name] section.
{{{
exec = /usr/sbin/imapd
execargs = imapd
}}}
Here is an example of advanced engine configuration to read private key from an OpenSC engine
{{{
engine=dynamic
engineCtrl=SO_PATH:/usr/lib/opensc/engine_pkcs11.so
engineCtrl=ID:pkcs11
engineCtrl=LIST_ADD:1
engineCtrl=LOAD
engineCtrl=MODULE_PATH:/usr/lib/pkcs11/opensc-pkcs11.so
engineCtrl=INIT
[service]
engineNum=1
key=id_45
}}}
!FILES
stunnel.conf
stunnel configuration file
stunnel.pem
stunnel certificate and private key
!BUGS
Option execargs does not support quoting.
!RESTRICTIONS
stunnel cannot be used for the FTP daemon because of the nature of the FTP protocol which utilizes multiple ports for data transfers. There are available SSL enabled versions of FTP and telnet daemons, however.
!NOTES
!INETD MODE
The most common use of stunnel is to listen on a network port and establish communication with either a new port via the connect option, or a new program via the exec option. However there is a special case when you wish to have some other program accept incoming connections and launch stunnel, for example with inetd, xinetd, or tcpserver.
For example, if you have the following line in inetd.conf:
{{{
imaps stream tcp nowait root /usr/sbin/stunnel stunnel /etc/stunnel/imaps.conf
}}}
In these cases, the inetd-style program is responsible for binding a network socket (imaps above) and handing it to stunnel when a connection is received. Thus you do not want stunnel to have any accept option. All the Service Level Options should be placed in the global options section, and no [service_name] section will be present. See the EXAMPLES section for example configurations.
!!CERTIFICATES
Each SSL enabled daemon needs to present a valid X.509 certificate to the peer. It also needs a private key to decrypt the incoming data. The easiest way to obtain a certificate and a key is to generate them with the free OpenSSL package. You can find more information on certificates generation on pages listed below.
The order of contents of the .pem file is important. It should contain the unencrypted private key first, then a signed certificate (not certificate request). There should be also empty lines after certificate and private key. Plaintext certificate information appended on the top of generated certificate should be discarded. So the file should look like this:
{{{
-----BEGIN RSA PRIVATE KEY-----
[encoded key]
-----END RSA PRIVATE KEY-----
[empty line]
-----BEGIN CERTIFICATE-----
[encoded certificate]
-----END CERTIFICATE-----
[empty line]
}}}
!!RANDOMNESS
stunnel needs to seed the PRNG (pseudo random number generator) in order for SSL to use good randomness. The following sources are loaded in order until sufficient random data has been gathered:
* The file specified with the RNDfile flag.
* The file specified by the RANDFILE environment variable, if set.
* The file .rnd in your home directory, if RANDFILE not set.
* The file specified with '-''''-with-random' at compile time.
* The contents of the screen if running on Windows.
* The egd socket specified with the EGD flag.
* The egd socket specified with '-''''-with-egd-sock' at compile time.
* The /dev/urandom device.
With recent (>=OpenSSL 0.9.5a) version of SSL it will stop loading random data automatically when sufficient entropy has been gathered. With previous versions it will continue to gather from all the above sources since no SSL function exists to tell when enough data is available.
Note that on Windows machines that do not have console user interaction (mouse movements, creating windows, etc) the screen contents are not variable enough to be sufficient, and you should provide a random file for use with the RNDfile flag.
Note that the file specified with the RNDfile flag should contain random data -- that means it should contain different information each time stunnel is run. This is handled automatically unless the RNDoverwrite flag is used. If you wish to update this file manually, the openssl rand command in recent versions of OpenSSL, would be useful.
One important note -- if /dev/urandom is available, OpenSSL has a habit of seeding the PRNG with it even when checking the random state, so on systems with /dev/urandom you're likely to use it even though it's listed at the very bottom of the list above. This isn't stunnel's behaviour, it's OpenSSLs.
!SEE ALSO
* [[tcpd(8)]] access control facility for internet services
* [[inetd(8)]] internet 'super-server'
* [[http://stunnel.mirt.net/]] stunnel homepage
* [[http://www.stunnel.org/]] stunnel Frequently Asked Questions
* [[http://www.openssl.org/]] OpenSSL project website
!AUTHOR
* Michal Trojnara [[mailto:Michal.Trojnara@mirt.net]]
* [[busybox(1)|man - busybox(1)]]
**[[ar|man - busybox(1) - ar]]
**[[basename|man - busybox(1) - basename]]
**[[cat|man - busybox(1) - cat]]
**[[chgrp|man - busybox(1) - chgrp]]
**[[chmod|man - busybox(1) - chmod]]
**[[chown|man - busybox(1) - chown]]
**[[chroot|man - busybox(1) - chroot]]
**[[chvt|man - busybox(1) - chvt]]
**[[clear|man - busybox(1) - clear]]
**[[cp|man - busybox(1) - cp]]
**[[cut|man - busybox(1) - cut]]
**[[date|man - busybox(1) - date]]
**[[dc|man - busybox(1) - dc]],
**[[dd|man - busybox(1) - dd]]
**[[deallocvt|man - busybox(1) - deallocvt]]
**[[df|man - busybox(1) - df]]
**[[dirname|man - busybox(1) - dirname]]
**[[dmesg|man - busybox(1) - dmesg]]
**[[dos2unix|man - busybox(1) - dos2unix]]
**[[du|man - busybox(1) - du]]
**[[dumpkmap|man - busybox(1) - dumpkmap]]
**[[dutmp|man - busybox(1) - dutmp]]
**[[echo|man - busybox(1) - echo]]
**[[false|man - busybox(1) - false]],
**[[fbset|man - busybox(1) - fbset]]
**[[fdflush|man - busybox(1) - fdflush]]
**[[find|man - busybox(1) - find]]
**[[free|man - busybox(1) - free]]
**[[freeramdisk|man - busybox(1) - freeramdisk]]
**[[fsck.minix|man - busybox(1) - fsck minix]]
**[[getopt|man - busybox(1) - getopt]]
**[[grep|man - busybox(1) - grep]]
**[[gunzip|man - busybox(1) - gunzip]],
**[[gzip|man - busybox(1) - gzip]]
**[[halt|man - busybox(1) - halt]]
**[[head|man - busybox(1) - head]]
**[[hostid|man - busybox(1) - hostid]]
**[[hostname|man - busybox(1) - hostname]]
**[[id|man - busybox(1) - id]]
**[[init|man - busybox(1) - init]]
**[[insmod|man - busybox(1) - insmod]]
**[[kill|man - busybox(1) - kill]]
**[[killall|man - busybox(1) - killall]]
**[[length|man - busybox(1) - length]],
**[[ln|man - busybox(1) - ln]]
**[[loadacm|man - busybox(1) - loadacm]]
**[[loadfont|man - busybox(1) - loadfont]]
**[[loadkmap|man - busybox(1) - loadkmap]]
**[[logger|man - busybox(1) - logger]]
**[[logname|man - busybox(1) - logname]]
**[[ls|man - busybox(1) - ls]]
**[[lsmod|man - busybox(1) - lsmod]]
**[[makedevs|man - busybox(1) - makedevs]]
**[[mkdir|man - busybox(1) - mkdir]],
**[[mkfifo|man - busybox(1) - mkfifo]]
**[[mkfs.minix|man - busybox(1) - mkfs minix]]
**[[mknod|man - busybox(1) - mknod]]
**[[mkswap|man - busybox(1) - mkswap]]
**[[mktemp|man - busybox(1) - mktemp]]
**[[more|man - busybox(1) - more]]
**[[mount|man - busybox(1) - mount]]
**[[mt|man - busybox(1) - mt]]
**[[mv|man - busybox(1) - mv]]
**[[nc|man - busybox(1) - nc]]
**[[nslookup|man - busybox(1) - nslookup]],
**[[ping|man - busybox(1) - ping]]
**[[poweroff|man - busybox(1) - poweroff]]
**[[printf|man - busybox(1) - printf]]
**[[ps|man - busybox(1) - ps]]
**[[pwd|man - busybox(1) - pwd]]
**[[rdate|man - busybox(1) - rdate]]
**[[reboot|man - busybox(1) - reboot]]
**[[renice|man - busybox(1) - renice]]
**[[reset|man - busybox(1) - reset]]
**[[rm|man - busybox(1) - rm]]
**[[rmdir|man - busybox(1) - rmdir]],
**[[rmmod|man - busybox(1) - rmmod]]
**[[sed|man - busybox(1) - sed]]
**[[setkeycodes|man - busybox(1) - setkeycodes]]
**[[sh|man - busybox(1) - sh]]
**[[sleep|man - busybox(1) - sleep]]
**[[sort|man - busybox(1) - sort]]
**[[swapoff|man - busybox(1) - swapoff]]
**[[swapon|man - busybox(1) - swapon]]
**[[sync|man - busybox(1) - sync]]
**[[syslogd|man - busybox(1) - syslogd]]
**[[tail|man - busybox(1) - tail]],
**[[tar|man - busybox(1) - tar]]
**[[tee|man - busybox(1) - tee]]
**[[telnet|man - busybox(1) - telnet]]
**[[test|man - busybox(1) - test]]
**[[touch|man - busybox(1) - touch]]
**[[tr|man - busybox(1) - tr]]
**[[true|man - busybox(1) - true]]
**[[tty|man - busybox(1) - tty]]
**[[umount|man - busybox(1) - umount]]
**[[uname|man - busybox(1) - uname]]
**[[uniq|man - busybox(1) - uniq]]
**[[unix2dos|man - busybox(1) - unix2dos]],
**[[unrpm|man - busybox(1) - unrpm]]
**[[update|man - busybox(1) - update]]
**[[uptime|man - busybox(1) - uptime]]
**[[usleep|man - busybox(1) - usleep]]
**[[uudecode|man - busybox(1) - uudecode]]
**[[uuencode|man - busybox(1) - uuencode]]
**[[wc|man - busybox(1) - wc]]
**[[which|man - busybox(1) - which]]
**[[whoami|man - busybox(1) - whoami]]
**[[yes|man - busybox(1) - yes]],
**[[zcat|man - busybox(1) - zcat]]
**[[ [|man - busybox(1) - []]
* [[stunnel(8)|man - stunnel(8)]]
!Web Sites
*http://www.mathopd.org/ -- Home of mathopd
!Configuration
mathopd requires a fine tunned configuration as follow:
* a non-root user in {{{/etc/passwd}}} file
* a {{{/etc/mathopd.cfg}}} file
* an optional {{{/var/mathopd}}} directory (depending of the {{{/etc/mathopd.cfg}}} configuration file)
!!Minimal /etc/mathopd
{{{
TODO...
}}}
!Compilation
<<<
Stunnel is a program that allows you to encrypt arbitrary TCP connections inside SSL (Secure Sockets Layer) available on both Unix and Windows. Stunnel can allow you to secure non-SSL aware daemons and protocols (like POP, IMAP, LDAP, etc) by having Stunnel provide the encryption, requiring no changes to the daemon's code.
<<<
!Web Sites
http://www.stunnel.org/ -- Home of stunnel
!Configure stunnel
TODO...
!See also
[[Man stunnel(8)|stunnel(8)]]
[[Building stunnel]]
!Relocation process
u-boot is first relocated from its initial address range to its target address range {{{TEXT_BASE = 0xa1f00000}}} in file {{{u-boot/board/LPC2468OEM_Board/config.mk}}}. The initial address range is either the internal flash {{{0x00000000}}} or the external ram {{{0xa1000000}}}, if {{{CONFIG_SKIP_LOWLEVEL_INIT]]] is define in the file {{{u-boot/include/configs/LPC2468OEM_Board.h}}}.q
uClinux is the base distribution that has been used to build the things for the target as well as for the host. This includes a full automated construction as well as partial construction.
!uClinux make help
* make menuconfig -
* make - build the whoole things
* make u-boot (NEW) - build u-boot only
* make linux - build linux only
* make linux_menuconfig - linux configuration in a terminal L&F. exists also in linux_config, linux_xconfig variants
* make config_menuconfig - application configuration in a terminal L&F. - exists also in linux_config, linux_xconfig variants
* make linux_archive (NEW) - generate a snapshot from the current {{{LINUXDIR}}}.
* make u-boot_archive (FUTURE) - generate a snapshot from the current {{{BOOTDIR}}}.
* make
* make help (FUTURE) - display this help
* make romfs (BROKEN)
(NEW): additional things to uClinux snapshot
(FUTURE): new thing to be done
(BROKEN): something which doesn't currently work
In the source repository you will find the following:
*kernel-2.6.21.tar.bz2 - see [[Building Linux Kernel]]
*kernel-2.6.21-diff.gz
*u-boot-1.2.0.tar.bz2
*u-boot-1.2.0-diff.gz
*uClibc-0.9.29.tar.bz2
*uClibc-0.9.29-diff.gz
*lib directory
**openssl-0.9.8e.tar.bz2 - see [[Building OpenSSL]]
**openssl-0.9.8e-diff.gz
**...
*user directory
**busybox-1.5.1.tar.bz2 - see [[Building busybox]]
**busybox-1.5.1-diff.gz
**mtd-utils-1.0.1.tar.bz2 - see [[Building mtd-utils]]
**mtd-utils-1.0.1-diff.gz
**...