Re-organized the forum to more cleanly delineate the development section, as the end user support side appears to have taken a life of its own!

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - admin

Pages: 1 ... 26 27 [28]
If we look at setup.c, we can quickly see what the issue is.

Our MEM_SIZE is completely different.
Lets copy the defines from the original setup.c, and see how that one compiles up.

Code: [Select]
#ifndef MEM_SIZE

#ifndef DRAM_SIZE
#define MEM_SIZE (7*1024*1024) //lsshi
#define MEM_SIZE        DRAM_SIZE
//#define END_MEM     (DRAM_BASE + MEM_SIZE)


#define CONFIG_CMDLINE "root=/dev/rom0 rw"

Recompile, and

Code: [Select]
arch/armnommu/kernel/kernel.o: In function `parse_tag':
arch/armnommu/kernel/kernel.o(.text.init+0xd18): undefined reference to `__tagtable_begin'
arch/armnommu/kernel/kernel.o(.text.init+0xd1c): undefined reference to `__tagtable_end'
arch/armnommu/kernel/kernel.o: In function `setup_arch':
arch/armnommu/kernel/kernel.o(.text.init+0xefc): undefined reference to `squash_mem_tags'
make[1]: *** [linux] Error 1
make[1]: Leaving directory `/home/N745/W90N745-uClinux/uClinux-dist/linux-2.4.x'
make: *** [linux] Error 1

Better, but no cigar.

Well, we do know that the squash_mem_tags are an extern reference in our setup.c
Lets go take a look at that again, and take a look at the newer uclinux files.

Seems that squash_mem_tags is defined in compat.c

Lets try out the newer compat.c in our BSP

A little better, but we still need to work out the __tagtable_begin and end bits.
Lets do the same thing - check the latest uClinux and see where those are defined.

Ahah, thats over in /home/uClinux-dist/linux-2.4.x/include/asm-armnommu/setup.h

Lets compare.

Seems the only change is to add the #define for_each_tag section.

Lets add that above the #define NR_BANKS 8 in our BSP setup.h

Code: [Select]
#define for_each_tag(t,base) \
for (t = base; t->hdr.size; t = tag_next(t))

If you've been following in the series of posts that no-one reads, you'll see that we have quite an old GCC toolchain for our BSP.

Lots of software that we want to compile really wants a newer toolchain, so what to do?

As a special gift for those of you who bother to actually read these posts, I've obtained an ARM gcc 3.3.4 toolchain (from MCUOS).

Lets download that.

Code: [Select]
mkdir /home/downloads
cd /home/downloads
cd /usr/local
tar -xjvf /home/downloads/arm_tools_3.3MCUOS.tar.bz2

At this point, we should have a copy of the tools in arm_tools_3.3 in /usr/local
Lets rename the existing gcc 3.0 tools to something else, and make this our toolchain of choice.
(We could also change the compiler preference in our config.arch or set a new path, but this is quicker)

Code: [Select]
mv arm_tools arm_tools_3.0
mv arm_tools_3.3 arm_tools

Lets head back to the BSP now

Code: [Select]
cd /home/N745/W90N745-uClinux/uClinux-dist
make clean
make dep

If you've followed the above, you'll soon see that gcc borks at the checksum.h file.
The first place we'll look is the ucLinux cvs to see what they think

Ahah!  revision 1.3 says - "the last gcc-3 changes broke the asm so that networking would not work,
get it right this time."

There is a newer revision however, so lets grab that, and see if its good.

Code: [Select]
cd uClinux-2.4.x/include/asm-armnommu
mv checksum.h checksum.h.2.4.20.orig
pico checksum.h

Copy and paste the code from;content-type=text%2Fplain, and save the file.

Lets return to our folder and continue the make.

Code: [Select]
cd /home/N745/W90N745-uClinux/uClinux-dist

Sweet, it got further.

What does it complain about now?

Code: [Select]
cc1: error: invalid option `no-fpu'
Lets see what causes that

Code: [Select]
grep "\-mno\-fpu" * -R
linux-2.4.x/arch/armnommu/Makefile:AFLAGS += $(apcs-y) $(proc-y) -mno-fpu
linux-2.4.x/arch/arm/Makefile:AFLAGS +=$(apcs-y) $(arch-y) -mno-fpu -msoft-float

Ok, its the armnommu makefile. (as we don't use the arm architecture)

Lets check the CVS -
Hmm, no Makefile.

Ok, back to google.
Interestingly we get zero results for -mno-fpu
This is obviously as its interpreting the -'s incorrectly.  Silly google.
Search for "-mno-fpu" instead, and we soon see that, its been depreciated, and we should be using -mfpu=softfpa
... Pass -mfpu=softfpa
   instead of -mno-fpu.

Lets make that change, and recompile.
Isn't life wonderful.

Oh wait, that didn't work either.

Code: [Select]
cc1: error: invalid option `fpu=softfpa'
Note to the gcc people, a fucking manual on when options were depreciated and their replacements would be of help.
Further googling ensues.

Ok, the same Nick now says this
There should be no need to recompile libgcc. Just change your build
script to use the -mfpu=softvfp switch instead of -mno-fpu.

Oh joy of joys.  Lets try that then shall we.
Guess what?

Code: [Select]
cc1: error: invalid option `fpu=softvfp'

Lets take a look at the compiler, and double check

Code: [Select]
arm-elf-gcc -dumpspecs
%{mapcs-float:-mfloat} %{msoft-float:-mno-fpu}

Lets try -msoft-float shall we?

Grumble, shitty gcc documentation, grumble etc moan..  :-X

Yay, that worked.  Now onto our next issue.

Code: [Select]
process.c:390: error: parse error before "mov"
Lets just be lazy and copy the newer process.c from the 2.4.36 uClinux current kernel over and see if that will compile.

Woohoo, that works.

Lets continue to our next issue.

Code: [Select]
semaphore.c:221: error: request for member `align' in something not a structure or union
We'll do the same for that..

Run make again..., sweet we got a *lot* further there

Code: [Select]
setup.c:422: error: core_tagtable causes a section type conflict
Lets copy that over, and remake.

So close...

Code: [Select]
setup.c:430: error: `ATAG_INITRD2' undeclared here (not in a function)
Now we're hitting stuff thats been added to the kernel, and isn't in ours.
Lets grep to see where ATAG_INITRD2 was added.

Code: [Select]
grep ATAG_INITRD2 * -R
linux-2.4.x/arch/armnommu/kernel/setup.c:__tagtable(ATAG_INITRD2, parse_tag_initrd2);
linux-2.4.x/arch/arm/kernel/setup.c:__tagtable(ATAG_INITRD2, parse_tag_initrd2);
linux-2.4.x/include/asm-arm/setup.h:#define ATAG_INITRD2 0x54420005
linux-2.4.x/include/asm-armnommu/setup.h:#define ATAG_INITRD2 0x54420005

- Looks like we'll need to add this line in our setup.h file
 #define ATAG_INITRD2   0x54420005

Code: [Select]
pico /home/N745/W90N745-uClinux/uClinux-dist/linux-2.4.x/include/asm-armnommu/setup.h

Add that line under the ATAG_INITRD line.

Recompile, and we're almost there. (Famous last words haha).

Code: [Select]
/usr/local/arm_tools/bin/arm-elf-ld.real: ERROR: irq.o uses hardware FP, whereas kernel.o uses software FP
/usr/local/arm_tools/bin/arm-elf-ld.real: failed to merge target specific data of file irq.o

So, it looks like our edit of the kernel makefile to remove the fp stuff didn't quite work.
Lets just remove that and recheck.

Code: [Select]
make clean
make dep

Almost there...

Ok, now we compile fine, but have linker problems.

As we have a different linker available - the 3.3.4 buildchain from the BSP, lets try building with that.
I'll save you the trouble and cut to the chase.

That one also breaks in the same place.

Lets retrace our steps a bit then.

We've made changes to


and the Makefile

as well as setup.h

Lets try compile using our original 3.0 gcc compiler, and see what happens.
If we roll back the setup.c and process.c files, it will compile.

So, we know that the changes that cause issues are in either of those 2 files.

Lets take a closer look at the files, and see if we can spot why.

uCLinux / Compiler Tips for uClinux
« on: February 03, 2011, 11:55:22 am »
uClinux beginners often get frustrated when things don't work.
The documentation is rather outdated, and googling isn't that helpful.

First off, lets look at whats needed for Linux 2.4 compiler wise. (from )

The recommended compiler for building Linux 2.4 is gcc 2.95 however the large majority of developers is probably user a more modern GCC. New compilers up to gcc 3.3 have been used successfully to build the kernel and only the latest 2.4 kernels have fixed the issues with gcc 3.4. GCC 4.x can not be used and with Linux 2.4 being in deep freeze mode we generally don't intend to fix such problems but rather recommend to use an older compiler for the kernel.

The latest official GCC 2 is version 2.95.3[1]. GCC 2.96[2] is an unofficial, massively patched version. It provides more efficient optimization with -O2, more strict syntax checking and supports more recent C++ standards. Unfortunately the C++ ABI is not fully compatible[3] with the official 2.95.3 nor 3.0. This is not a concern for building the kernel or modules as those are written in plain C but is a consideration if using a single toolchain for an entire distribution or product.

We have an existing working gcc compiler chain - aka arm_tools which comes with gcc 3.0, this can compile our kernel 2.4.20 version, but its quite old. We also have a gcc 3.3.4 version with the BSP which is supposed to be used to compile the userland (romfs) code.

Ideally we should be using one compiler chain to do it all, but doesn't work straight out of the box.
There is a mailing list for uClinux, but they really need better documentation (which is pretty much what I'm doing here ;) )

So, lets talk about how things compile under uClinux.

If you've been following my previous examples on how to setup a BSP, you'll note that we have 2 compiler environments, and 2 uClinux distributions.

The smarter readers will probably have a question at this point.

How does each distribution know what compiler to use?

Good question  ;)

uClinux has a number of folders in its structure.
The main one we'll be looking at in this post is the vendors folder.

In both the BSP and the current uClinux we see a list of vendors in the vendors folder.
The vendors folder contains the build instructions for each given architecture and cpu type.

Lets take a look at the BSP folder first, as its cleaner.

Code: [Select]
cd /home/N745/W90N745-uClinux/uClinux-dist/vendors/
minty vendors # ls -al
total 16
drwxr-xr-x  4 root root 4096 May 23  2008 .
drwxr-xr-x 10 root root 4096 May 26  2008 ..
drwxr-xr-x  3 root root 4096 May 23  2008 config
drwxr-xr-x  3 root root 4096 May 23  2008 Winbond

As you see, we have 2 folders.  One for the manufacturer, and one called config.
The config folder is the one we'll look at next

Code: [Select]
cd config/
minty config # ls -al
total 12
drwxr-xr-x 3 root root 4096 May 23  2008 .
drwxr-xr-x 4 root root 4096 May 23  2008 ..
drwxr-xr-x 2 root root 4096 May 23  2008 armnommu
minty config # cd armnommu/
minty armnommu # ls -al
total 24
drwxr-xr-x 2 root root 4096 May 23  2008 .
drwxr-xr-x 3 root root 4096 May 23  2008 ..
-rwxr-xr-x 1 root root 4401 May 23  2008 config.arch
-rwxr-xr-x 1 root root 4198 May 23  2008 config_old.arch

As you can see, we have a subfolder called armnommu.
armnommu refers to our cpu type.

We're running on an ARM7TDMI based chip, which is arm based, and has no mmu (no memory management unit).
Hence the cunningly named armnommu folder

The config.arch file is what tells the compiler how to build for our architecture.
Lets take a look inside

Code: [Select]
cat config.arch

MACHINE       = arm
ARCH          = armnommu
CROSS_COMPILE = arm-elf-


I've excerpted the relevant bits we need to look at.

CROSS_COMPILE = arm-elf-

Those 3 lines mean that our compiler call will look something like this


Essentially we've added a prefix to all the compiler code so it looks for arm-elf-XXX

Lets look at the config.arch for our ucLinux latest.

Code: [Select]
cd /home/uClinux-dist/vendors/config/armnommu
cat config.arch

This is a little more complicated, but it boils down to this.

It looks for these versions of the arm compiler in order of preference:

If it can't find them, it defaults to using this as a prefix.

We can find appropriate compiler chains which match those preferences over here -

Lets take a look at our /usr/local/ folder now, and see whats in there.
If you remember from above, the BSP is looking for arm-elf-XXX filenames
...and the latest uClinux is looking for arm-linux-XXX filenames.

Our path should include the folders for both sets of build utilities.  Lets check.

Code: [Select]
echo $PATH

The BSP put our build tools in /usr/local/arm_tools/bin
It should contain arm-elf-xxx files, lets check

Code: [Select]
cd /usr/local/arm_tools/bin
 ls -al
total 23140
drwxr-xr-x 2 root root    4096 May 26  2008 .
drwxrwxr-x 9 root root    4096 May  7  2003 ..
-rwxrwxr-x 1 root root 1043382 Aug  3  2001 arm-elf-addr2line
-rwxrwxr-x 2 root root  943208 Aug  3  2001 arm-elf-ar
-rwxrwxr-x 2 root root 1479964 Aug  3  2001 arm-elf-as
-rwxrwxr-x 2 root root  267769 Aug  8  2001 arm-elf-c++
-rwxrwxr-x 1 root root  195997 Aug  8  2001 arm-elf-c++filt
-rwxrwxr-x 1 root root  267880 Aug  8  2001 arm-elf-cpp
-rwxrwxr-x 1 root root   70692 Aug  7  2003 arm-elf-depmod
-rwxr-xr-x 1 root root  592520 Mar 24  2005 arm-elf-elf2flt
-rwxr-xr-x 1 root root  390012 Mar 24  2005 arm-elf-flthdr
-rwxrwxr-x 2 root root  267769 Aug  8  2001 arm-elf-g++
-rwxrwxr-x 1 root root  272426 Aug  8  2001 arm-elf-g77
-rwxrwxr-x 1 root root  211109 Aug  3  2001 arm-elf-gasp
-rwxrwxr-x 1 root root  264177 Aug  8  2001 arm-elf-gcc
-rwxrwxr-x 1 root root  274191 Aug  8  2001 arm-elf-gcj
-rwxr-xr-x 1 root root    4746 Mar 24  2005 arm-elf-ld
-rwxrwxr-x 1 root root 1416491 Nov  1  2001 arm-elf-ld.real
-rwxrwxr-x 2 root root 1037487 Aug  3  2001 arm-elf-nm
-rwxrwxr-x 1 root root 1442773 Aug  3  2001 arm-elf-objcopy
-rwxrwxr-x 1 root root 1573662 Aug  3  2001 arm-elf-objdump
-rwxrwxr-x 2 root root  943207 Aug  3  2001 arm-elf-ranlib
-rwxrwxr-x 1 root root  445502 Aug  3  2001 arm-elf-readelf
-rwxrwxr-x 1 root root  884019 Aug  3  2001 arm-elf-size
-rwxrwxr-x 1 root root  883237 Aug  3  2001 arm-elf-strings
-rwxrwxr-x 2 root root 1442772 Aug  3  2001 arm-elf-strip
-rwxrwxr-x 1 root root 2685109 Nov  1  2001 elf2flt
-rwxrwxr-x 1 root root 1708896 Nov  1  2001 flthdr
-rwxrwxr-x 1 root root   16764 Aug  8  2001 gccbug
-rwxrwxr-x 1 root root  285104 Aug  8  2001 gcjh
-rwxrwxr-x 1 root root  109914 Aug  8  2001 gcov
-rwxrwxr-x 1 root root   19562 Jun 12  2003 genbin
-rwxrwxr-x 1 root root   15568 Feb 10  2003 genromfs
-rwxrwxr-x 1 root root  182342 Aug  8  2001 jar
-rwxrwxr-x 1 root root  305247 Aug  8  2001 jcf-dump
-rwxrwxr-x 1 root root  187871 Aug  8  2001 jv-scan
-rwxrwxr-x 1 root root    2006 Nov  2  2001 ld-elf2flt
-rwxrwxr-x 1 root root 1416491 Nov  1  2001 ld-elf2flt.real
-rwxrwxr-x 1 root root   16708 Feb 19  2003 makeimg
-rwxrwxr-x 1 root root   23279 Jun 18  2003 mkrom
-rwxrwxr-x 1 root root   19594 Oct 31  2003 mkupgfw

Yup, that looks good.

Now lets check our other folder (/usr/local/bin)

Code: [Select]
cd /usr/local/bin
minty bin # ls -al
total 9228
drwxr-xr-x  2 root root    4096 Feb  3 15:53 .
drwxrwsr-x 15 root staff   4096 Feb  3 17:25 ..
-rwxr-xr-x  1 root root    4275 Oct  4 16:30 apt
-rwxr-xr-x  1 root root  433320 Jun 23  2008 arm-linux-addr2line
-rwxr-xr-x  1 root root    1022 Jun 20  2008 arm-linux-addr2name.awk
-rwxr-xr-x  2 root root  454852 Jun 23  2008 arm-linux-ar
-rwxr-xr-x  2 root root  787160 Jun 23  2008 arm-linux-as
-rwxr-xr-x  2 root root  178660 Jun 23  2008 arm-linux-c++
-rwxr-xr-x  1 root root  433752 Jun 23  2008 arm-linux-c++filt
-rwxr-xr-x  1 root root  177956 Jun 23  2008 arm-linux-cpp
-rwxr-xr-x  1 root root  430000 Jun 23  2008 arm-linux-elf2flt
-rwxr-xr-x  1 root root   10064 Jun 23  2008 arm-linux-flthdr
-rwxr-xr-x  2 root root  178660 Jun 23  2008 arm-linux-g++
-rwxr-xr-x  2 root root  176612 Jun 23  2008 arm-linux-gcc
-rwxr-xr-x  2 root root  176612 Jun 23  2008 arm-linux-gcc-4.2.4
-rwxr-xr-x  1 root root   15934 Jun 20  2008 arm-linux-gccbug
-rwxr-xr-x  1 root root  181796 Jun 23  2008 arm-linux-gcj
-rwxr-xr-x  1 root root   77056 Jun 23  2008 arm-linux-gcjh
-rwxr-xr-x  1 root root   22788 Jun 23  2008 arm-linux-gcov
-rwxr-xr-x  1 root root  179780 Jun 23  2008 arm-linux-gfortran
-rwxr-xr-x  1 root root   77060 Jun 23  2008 arm-linux-gjnih
-rwxr-xr-x  1 root root  488840 Jun 23  2008 arm-linux-gprof
-rwxr-xr-x  1 root root   94764 Jun 23  2008 arm-linux-jcf-dump
-rwxr-xr-x  1 root root   68004 Jun 23  2008 arm-linux-jv-scan
-rwxr-xr-x  1 root root    5467 Jun 23  2008 arm-linux-ld
-rwxr-xr-x  2 root root  837008 Jun 23  2008 arm-linux-ld.real
-rwxr-xr-x  2 root root  442952 Jun 23  2008 arm-linux-nm
-rwxr-xr-x  2 root root  571412 Jun 23  2008 arm-linux-objcopy
-rwxr-xr-x  2 root root  685736 Jun 23  2008 arm-linux-objdump
-rwxr-xr-x  2 root root  454884 Jun 23  2008 arm-linux-ranlib
-rwxr-xr-x  1 root root  226000 Jun 23  2008 arm-linux-readelf
-rwxr-xr-x  1 root root  435032 Jun 23  2008 arm-linux-size
-rwxr-xr-x  1 root root  434600 Jun 23  2008 arm-linux-strings
-rwxr-xr-x  2 root root  571412 Jun 23  2008 arm-linux-strip
-rwxr-xr-x  1 root root   27126 May 20  2003 genext2fs
-rwxr-xr-x  1 root root   11384 Jun 26  2008 genromfs

Yup, that also looks good.

Now, lets try to compile the BSP with a newer toolchain, and see what happens.

Code: [Select]
cd /home/N745/W90N745-uClinux/uClinux-dist/vendors/config/armnommu
pico config.arch

Change the CROSS_COMPILE line as follows:

Code: [Select]
CROSS_COMPILE = arm-linux-

Save, and exit

Lets clean up our build folder in preparation for our build.
Code: [Select]
cd /home/N745/W90N745-uClinux/uClinux-dist
make clean
make dep

Finally, lets try to make the build

Code: [Select]

What happened?

Lets look at the output
Code: [Select]
make ARCH=armnommu CROSS_COMPILE=arm-linux- -C linux-2.4.x  || exit 1
make[1]: Entering directory `/home/N745/W90N745-uClinux/uClinux-dist/linux-2.4.x'
arm-linux-gcc -D__KERNEL__ -I/home/N745/W90N745-uClinux/uClinux-dist/linux-2.4.x/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -D__WB_EVB__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -mshort-load-bytes   -DKBUILD_BASENAME=main -c -o init/main.o init/main.c
cc1: error: unrecognized command line option "-mapcs-32"
cc1: error: unrecognized command line option "-mshort-load-bytes"
make[1]: *** [init/main.o] Error 1
make[1]: Leaving directory `/home/N745/W90N745-uClinux/uClinux-dist/linux-2.4.x'
make: *** [linux] Error 1

Looks like our newer gcc compiler doesn't support the -mapcs-32 or mshort-load-bytes command.

Lets take a look at the compiler documentation for GCC

Seems thats only supported in older versions of GCC.

Lets take a look at our original compiler binary.

Code: [Select]
./arm-elf-gcc  -v
Reading specs from ./../lib/gcc-lib/arm-elf/3.0/specs
Configured with: ../gcc-3.0/configure --target=arm-elf --host=i686-pc-linux --build=i686-pc-linux --prefix=/home/clyu2/gcc3.0/arm_com --with-gnu-ld --with-gnu-as : (reconfigured) ../gcc-3.0/configure --target=arm-elf --host=i686-pc-linux --build=i686-pc-linux --prefix=/home/clyu2/gcc3.0/arm_com --with-gnu-ld --with-gnu-as --with-newlib : (reconfigured) ../gcc-3.0/configure --target=arm-elf --host=i686-pc-linux --build=i686-pc-linux --prefix=/home/clyu2/gcc3.0/arm_com --with-gnu-ld --with-gnu-as --with-newlib : (reconfigured) ../gcc-3.0/configure --target=arm-elf --host=i686-pc-linux --build=i686-pc-linux --prefix=/home/clyu2/gcc3.0/arm_com --with-gnu-ld --with-gnu-as --with-newlib : (reconfigured) ../gcc-3.0/configure --target=arm-elf --host=i686-pc-linux --build=i686-pc-linux --prefix=/home/clyu2/gcc3.0/arm_com --with-gnu-ld --with-gnu-as --with-newlib : (reconfigured) ../gcc-3.0/configure --target=arm-elf --host=i686-pc-linux --build=i686-pc-linux --prefix=/home/clyu2/gcc3.0/arm_com --with-gnu-ld --with-gnu-as --with-newlib : (reconfigured) ../gcc-3.0/configure --target=arm-elf --host=i686-pc-linux --build=i686-pc-linux --prefix=/home/clyu2/gcc3.0/arm_com --with-gnu-ld --with-gnu-as --with-newlib : (reconfigured) ../gcc-3.0/configure --target=arm-elf --host=i686-pc-linux --build=i686-pc-linux --prefix=/home/clyu2/gcc3.0/arm_com --with-gnu-ld --with-gnu-as --with-newlib : (reconfigured) ../gcc-3.0/configure --target=arm-elf --host=i686-pc-linux --build=i686-pc-linux --prefix=/home/clyu2/gcc3.0/arm_com --with-gnu-ld --with-gnu-as --with-newlib
Thread model: single
gcc version 3.0

Yikes, its ancient - gcc 3.0!

What version of gcc is the newer compiler version?

Code: [Select]
./arm-linux-gcc -v
Using built-in specs.
Target: arm-linux
Configured with: ../configure --target=arm-linux --disable-shared --prefix=/usr/local --with-headers=/home/gerg/src/gnu/arm-linux/linux-2.6.25/include --with-gnu-as --with-gnu-ld --enable-multilib
Thread model: posix
gcc version 4.2.4

Hmm, the newer version is 4.2.4, much newer. (and also not going to work, as its made for the 2.6.x kernel, not 2.4!).  Lets continue anyway and follow through this example.

So, what to do?

Lets go back to the error

Code: [Select]
cc1: error: unrecognized command line option "-mapcs-32"
cc1: error: unrecognized command line option "-mshort-load-bytes"

The gcc compiler doesn't recognize those commands anymore, so lets see what replaced those.

Some googling shows that this can be fixed by using -mabi=apcs-gnu instead of -mapcs-32
and -mshort-load-bytes can fixed by changing it to -malignment-traps

Would be nice if the gcc compiler documentation mentioned this, but, it doesn't.  Sigh.
Now we know that,  lets go find where its adding that and fix it.

Code: [Select]
cd /home/N745/W90N745-uClinux/uClinux-dist/linux-2.4.x
grep mapcs * -R
arch/arm/Makefile:CFLAGS :=$(CFLAGS:-fomit-frame-pointer=-mapcs -mno-sched-prolog)
arch/arm/Makefile:apcs-y :=-mapcs-32
arch/arm/Makefile:apcs-$(CONFIG_CPU_26) :=-mapcs-26 -mcpu=arm3 -Os
arch/armnommu/Makefile:apcs-$(CONFIG_CPU_26) :=-mapcs-26 -mcpu=arm3 -Os
arch/armnommu/Makefile:apcs-$(CONFIG_CPU_32) :=-mapcs-32
drivers/block/doc/ -Wno-trigraphs -mapcs -fno-strict-aliasing -fno-common -pipe -mapcs-32 \

Looks like its set in a few places.  Lets start with the appropriate one - arch/armnommu/Makefile


apcs-$(CONFIG_CPU_32) so it uses the new compiler command.

Code: [Select]
apcs-$(CONFIG_CPU_32)           :=-mabi=apcs-gnu         

and change
Code: [Select]
CFLAGS          += $(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes

Code: [Select]
CFLAGS          += $(apcs-y) $(arch-y) $(tune-y) $(call cc-option,$(call cc-option,-malignment-traps,))
Save, and try to compile.

You'll get further this time, but it will still break.
However, we have fixed that particular compiler build issue.

Now you have an idea of why things don't work, and what to do to fix them.

If you want to continue with this, the next error is this:

Code: [Select]
init/do_mounts.c:56: error: static declaration of ‘root_device_name’ follows non-static declaration
/home/N745/W90N745-uClinux/uClinux-dist/linux-2.4.x/include/linux/fs.h:1488: error: previous declaration of ‘root_device_name’ was here


Google shows this as the issue -

So, which file are you going to edit, and why?

I know the answer, but do you?


uCLinux / Setting up a build environment for the N745 BSP
« on: February 03, 2011, 10:47:11 am »
Note that this differs from our instructions on building a dev environment for uClinux.
See here for instructions on that [ ]

If you've followed our previous examples, you'll note that we should already have a compiler chain and uClinux installed.

We'll be installing another compiler chain for the older 2.4.20 based N745 BSP, so we can compile.

We need both the current uClinux, and the older 2.4.20 version, as we'll need to borrow files from the newer version in order to install certain drivers.

Lets start.

First off, we'll need to download the BSP (Board Support Package) for the CPU.
I've placed a copy of that here:
Open up a terminal window, and enter the following:

Code: [Select]
sudo su
mkdir -p /home/downloads
cd /home/downloads
apt-get install axel

That will download the BSP into /home/downloads.
Lets decompress it now

Code: [Select]
tar -xzvf W90N745BSP05262008.tar.gz
cd W90N745BSP/BSP
tar -xzvf W90N745.tar.gz
cd W90N745_PR

This will decompress the BSP, and start the installer.
We'll need to tell the installer where to put our files (I recommend /home/N745)

Code: [Select]
successfully finished installing arm_tools.tar.gz
now begin to install build.tar.gz,TestApps.tar.gz and uClinux-dist.tar.gz
Please enter your absolute path for installing build.tar.gz, TestApps.tar.gz and uClinux-dist.tar.gz:

If you see warnings about usleep not found during the install process, feel free to ignore them.

Assuming you followed my recommendations, we should have a copy of the BSP installed at


In order to make sure that we start from a clean slate, we'll need to clean the BSP build folder (which imho should have been done by Winbond prior to compressing the BSP.)

We'll also need to add the build-tools to our PATH.  The BSP has put them into /usr/local/arm_tools

Lets test to see if they work

Code: [Select]

If you see this -
 arm-elf-gcc: No input files
It means we're good to go.

If, however you get an error saying something like
bash arm-elf-gcc no such file or directory
You're probably running on a 64bit OS, and haven't installed a 32bit dynamic loader.

If thats the case, install libc6-i386

Code: [Select]
apt-get install libc6-i386

Lets continue.

Code: [Select]
cd /home/N745/W90N745-uClinux/uClinux-dist
make clean

In the above, we change to the BSP folder, add the compile tools to our path, and then clean out the old .depend, .o files from our BSP folder, so we have a nice clean slate to start from.
This does not however remove the vendor configuration for the board, so don't worry about that!

For test purposes lets make sure that it compiles (as a just in case test).
Linux 2.4.x requires a make dep prior to compiling, so we need to run that first.

Code: [Select]
make dep

You should see a few hundred pages scroll by rather quickly (depending on the speed of your computer!), and if all goes well,we should see a new linux.bin generated in ../image

Code: [Select]
ls -al ../image/
total 2480
drwxr-xr-x 2 root root    4096 May 26  2008 .
drwxr-xr-x 6 root root    4096 Feb  3 17:25 ..
-rwxr-xr-x 1 root root 1065308 Feb  3 17:37 linux.bin
-rw-r--r-- 1 root root  514896 May 26  2008
-rw-r--r-- 1 root root  618496 May 26  2008 romfs.img
-rw-r--r-- 1 root root  326900 May 26  2008

If you look closely, the compile time for our linux.bin above is newer than the rest of the files, which means its fresh from our make compile..

At this point, we have 2 compiler environments running; one for our BSP, and one for the latest uClinux.

[I've added these instructions to the wiki also]

uCLinux / Web Server recommendations for our Firmware
« on: February 03, 2011, 09:53:18 am »
Reading the overview here for, it looks like that Webserver would make a good solution to use in a rebuilt firmware.  Its small, and it does what is needed.  It also runs as a single process (good for small embedded systems like ours).
There are other choices - like litettpd, boa, but this is smaller, and compiles cleanly.

Looks fairly straightforward to implement too.

The cgi implementation part looks especially perfect -

Some patches here -

..and lastly an example of how to use it in a shell script  (as a cgi)

Call this something appropriate like


Code: [Select]
echo Content-Type: application/zip
echo "Content-Disposition: attachment;"
zip -9r - *

You'll also need to ensure zip is compiled in, for that example, but it shows what can be done easily.

uCLinux / Setting up a build environment
« on: February 03, 2011, 04:28:32 am »
While the uClinux developers have done a great job of making an updated embedded OS based on the Linux kernel, they haven't done such a great job on documenting it.

I'm going to assume a debian based OS for the following.

Suggest download a prebuilt Debian GUI based OS if you aren't familiar with Debian, Linux Mint is a good clean version that has its heart in the right place.

Download that here:

Assuming you now have that installed, we can continue.

In order to compile uClinux, we first need to install a cross compiler.
Unfortunately there are many different incompatible arm gcc cross-compilers, so we need one that works with our uClinux version.  Unfortunately this seems to be a bit trial and error, which is sucky.

The most current arm cross compiler's are located here -
and here

So, our first step is to download one, and install.
As this is a large file, we're going to use a download accelerator called Axel.
Open up a terminal window, and type in the following

Code: [Select]
sudo su
mkdir /home/downloads
cd /home/downloads
apt-get install axel

sudo su - tells the computer that we want to run as root user.  We need to do this as the tools require us to be root to install.
mkdir /home/downloads, cd /home/downloads - we make our download folder, and change into it.
apt-get install axel - we install axel (our download accelerator).
Lastly, we download the ucLinux compiler tools.  This will take a while as its quite large.

Go have a cup of coffee and come back  :D

As uClinux has changed the way they do their xwindows configuration, we also need to install some extra libraries in our OS to cater for this.  Install tk, ncurses, and libglade2 with the following command.

Code: [Select]
apt-get install tk  libglade2-dev ncurses-dev
This will also add a whole bunch of other prerequisites to be downloaded.  Say yes, and go get another coffee while this all downloads and installs.

Lastly, we need the most current uClinux files.
Go here -  and copy the link for the latest version.
At time of writing, this was 
Copy the link, and click back in the terminal window.

Code: [Select]
Note:  You can also get the CVS version of uClinux, but I recommend compiling from the Stable edition.

If you've been following, so far we should have the ARM compiler tools, uClinux distribution in our /home/downloads folder.  We've also installed a few required bits and pieces into our OS.

Our next step is to start installing..
Just to be safe, I make sure that we're root, and in the correct folder prior to starting (the arm-linux-tools expects to be run from the root folder)

Code: [Select]
sudo su
cd /
tar -xzvf /home/downloads/arm-linux-tools-20080623.tar.gz

You'll see a whole lot of lines flying by the terminal window, and eventually it will complete.
This will have installed the arm compiler tools into /usr/local/bin for you.

Next, we'll need to decompress the uClinux distribution somewhere appropriate.  I use /home/uClinux-dist, so lets use that.

Code: [Select]
cd /home
tar -xjvf downloads/uClinux-dist-20101026.tar.bz2

You should have a folder under home called uClinux-dist now.
Lets change into that folder.

Code: [Select]
cd uClinux-dist
ls -al

You should see something similar to the following:

minty uClinux-dist # ls -al
total 152
drwxrwxr-x  17  500  500  4096 Feb  3 13:33 .
drwxr-xr-x   6 root root  4096 Feb  3 13:33 ..
drwxrwxr-x   2  500  500  4096 Oct 26 12:02 bin
drwxrwxr-x   3  500  500  4096 Oct 26 12:02 config
-rw-rw-r--   1  500  500 18007 Nov 22  1999 COPYING
drwxrwxr-x   3  500  500  4096 Oct 26 11:59 Documentation
drwxrwxr-x  11  500  500  4096 Oct 26 12:00 freeswan
drwxrwxr-x   2  500  500  4096 Oct 26 12:00 glibc
drwxrwxr-x   2  500  500  4096 Oct 26 12:01 include
-rw-r--r--   1 root root 26903 Feb  3 13:00 Kconfig
drwxrwxr-x  51  500  500  4096 Oct 26 12:02 lib
drwxrwxr-x  15  500  500  4096 Oct 26 11:59 linux-2.0.x
drwxrwxr-x  16  500  500  4096 Oct 26 11:59 linux-2.4.x
drwxrwxr-x  23  500  500  4096 Oct 26 12:02 linux-2.6.x
-rw-rw-r--   1  500  500 15412 Oct 21 08:28 Makefile
drwxrwxr-x  18  500  500  4096 Oct 26 12:00 openswan
-rw-rw-r--   1  500  500  5613 Apr 10  2008 README
-rw-rw-r--   1  500  500  1743 Jan 21  2004 SOURCE
drwxrwxr-x   8  500  500  4096 Oct 26 12:01 tools
drwxrwxr-x  17  500  500  4096 Oct 26 12:00 uClibc
drwxrwxr-x 283  500  500 12288 Oct 26 12:02 user
drwxrwxr-x  71  500  500  4096 Oct 26 12:02 vendors

Lets check if everything is setup.

Code: [Select]
make xconfig

You should see a few lines of compiler code, and a new window popup on the desktop, saying uClinux Distribution.
If you do, well done, our environment is setup.

Take a look at the configuration options in the window to see whats available (but don't save any changes yet!).

If you don't see a window popup, check you've added the tk and libglade2 libraries, and have downloaded all the items above.  The terminal window should show you what went wrong.  If you're having issues, reply, and I'll see if I can help.

Assuming all went well though, we now have a build environment setup.

Well done!

Firmware / Firmware Recovery Tool
« on: February 02, 2011, 11:14:52 am »
Ramon van Bruggen's firmware download tool for IP-Cam's with uBoot
This is a Windows Tool, and requires .Net

Recovery Tool /files/

.NET 4.0 Installer /files/dotNetFx40_Full_x86_x64.exe

Ramon's site

Pages: 1 ... 26 27 [28]