[changing CC to psas-avionics, which replaced psas-software since I sent
the original mail.]

On Tue, Oct 06, 2009 at 08:38:06PM -0700, Sarah A Sharp wrote:
> My perpetual goal for PSAS is to get a new (2.6.31) Linux kernel
> installed on it, with dave and kay's userspace code to talk to an
> lpcusb board through usbfs.  I continue to try to follow the
> directions you posted a year and a half ago, but I continue to get
> lost, so bare with me. :)

Every time I try to build a new kernel for the board I get lost and have
to muddle through as well; these processes just don't stay fixed over
time. :)

By the way, I looked at the current denx tree, and I'd guess that you
probably want to use the DENX-v2.6.31-stable branch.  It has some fixes
since the DENX-v2.6.31 tag.

> Can you please look over the following email and return it with
> unnecessary steps removed.  I think I remember that I don't need the
> flattened device tree, but I'm not sure.

You do need the fdt, actually.  It *might* not have changed since the
version the flight computer currently has, but it can't hurt to flash a
new one.

> In the meantime, I have completed the following steps on this page:
> http://psas.pdx.edu/FlightComputerAv2b/?updated
> I'm attempting to build the denx tree, but this command
>   make CROSS_COMPILE=powerpc-linux-gnu- ARCH=powerpc tqm5200_defconfig
> gives this error:
>   Can't find default configuration "arch/powerpc/configs/tqm5200_defconfig"!

They moved it in April 2008.  You now want:

make CROSS_COMPILE=powerpc-linux-gnu- ARCH=powerpc 52xx/tqm5200_defconfig

I just tested that with current DENX-v2.6.31-stable
(c94e8c9e1834eed8e7bed0912e5d482073a3cd08), and it worked.

And, after doing that, you can:

make CROSS_COMPILE=powerpc-linux-gnu- ARCH=powerpc menuconfig

and use menuconfig to add anything else you need.

> On Wed, Jan 16, 2008 at 3:34 PM, Josh Triplett <j...@freedesktop.org> wrote:
> > Short version of the process (mostly of interest to the software and
> > avionics teams):
> >
> > * Newer 2.6 kernels on embedded systems like our TQM5200 (with STK5200
> >  carrier board in this case) require a "flattened device tree" (fdt),
> >  AKA "device tree blob" (dtb), compiled from the device tree source
> >  (dts) in the Denx kernel source.  `apt-get install
> >  device-tree-compiler` for the compiler.  Then, build `tqm5200.dtb`
> >  from `tqm5200.dts`, with the command `dtc
> >  ./arch/powerpc/boot/dts/tqm5200.dts -R 4 -S 0x3000 -O dtb -o
> >  /tmp/tqm5200.dtb`.  `-R 4` reserves 4 slots for additional maps; an
> >  initramfs needs one, and the u-boot documentation I found recommends
> >  reserving 4.  `-S 0x3000` reserves some extra space for u-boot to
> >  extend the map at boot time.

You still need this step.  It looks like the fdt files *have* changed
several times, so I'd recommend compiling and flashing the one from the
kernel version you use.

> > * Booting kernels with an fdt requires a newer u-boot.  Build and
> >  install u-boot from the u-boot Git repository; commit
> >  6d714f82fb4b8bb7e267e9c71b8009bc670bfe88 worked for me.  `make
> >  CROSS_COMPILE=powerpc-linux-gnu- TQM5200_config`, then `make`.
> >  Install mkimage (found in `tools/mkimage`) on the `$PATH`, to build
> >  kernel and initramfs images later.
> >
> > * Flash the new `u-boot.bin` to the board using the existing copy of
> >  u-boot.  I used the `tftp` command to transfer `u-boot.bin` from my
> >  tftp server to the flight computer's memory, then flashed it to the
> >  firmware partition in the flash address space.  (The existing u-boot
> >  included an `update` command to automate flashing the new u-boot.bin
> >  from a given address, so I just used `run update`, but flashing
> >  manually would involve the `unprotect`, `erase`, `cp.b`, and
> >  `protect` commands.)  The new u-boot worked on the first try,
> >  fortunate since I would not get a second without a working JTAG or a
> >  wait for shipping.

The version of u-boot currently on the flight computer should work now,
but I'd recommend leaving this information in the guide.  And in any
case, building and flashing a new u-boot can't *hurt*.

> > * Build a 2.6 kernel from the DENX `linux-2.6-denx` tree, using `make
> >  CROSS_COMPILE=powerpc-linux-gnu- ARCH=powerpc tqm5200_defconfig`
> >  then `make CROSS_COMPILE=powerpc-linux-gnu- ARCH=powerpc uImage`.
> >  This used `mkimage`, and created `arch/powerpc/boot/uImage`.

As stated above, substitute "52xx/tqm5200_defconfig" for
"tqm5200_defconfig" here.  Should otherwise work.

> > * With the new u-boot, tftp the kernel and dtb to the flight
> >  computer's memory (I suggest using the `${kernel_addr_r}` and
> >  `${fdt_addr_r}` variables for the addresses.)  Then boot with `bootm
> >  ${kernel_addr_r} - ${fdt_addr_r}`.  This should boot the 2.6 kernel
> >  and get as far as failing to mount a root filesystem.

Still applies.

> > * You can at this point test booting with a root filesystem from
> >  compact flash or NFS, if you want.


> > * TFTP the kernel and dtb again, and flash them to the appropriate
> >  partitions in the onboard flash, designated by the `${kernel_addr}`
> >  and `${fdt_addr}` variables.  u-boot does not protect these
> >  partitions, so you just need to use "erase" and "cp.b".  Reboot, and
> >  try bootm again with the addresses from flash; this should again
> >  boot as far as trying to find a root filesystem.

Note that you *cannot* tftp directly to the ${kernel_addr} and
${fdt_addr} locations in flash.  You need to tftp to the _r addresses
and then use erase and cp.b to flash those to the non-_r addresses.

> > * Grab a copy of the latest busybox release.  Build it with `make
> >  CROSS_COMPILE=powerpc-linux-gnu- ARCH=powerpc defconfig`, then
> >  optionally configure differently with `make
> >  CROSS_COMPILE=powerpc-linux-gnu- ARCH=powerpc menuconfig` (or an
> >  alternative config target if you prefer), then build with `make
> >  CROSS_COMPILE=powerpc-linux-gnu- ARCH=powerpc`.  Run `make
> >  CROSS_COMPILE=powerpc-linux-gnu- ARCH=powerpc install` to install
> >  busybox and its symlinks to _install in the busybox source
> >  directory.

This should still work.

> > * Make a directory for building the initramfs.  `cp -a
> >  /path/to/busybox/_install/* initramfs/`.  Make a dev directory in
> >  `initramfs/`, and create device files for at least `null`,
> >  `console`, and `ttyPSC0`.  In the initramfs directory, run `find . |
> >  cpio -o -H newc | gzip > ../initramfs_data.cpio.gz`.  Now, turn that
> >  into a u-boot image with `mkimage -A ppc -T ramdisk -C gzip -n
> >  'Busybox initramfs' -d ../initramfs_data.cpio.gz ../uRamdisk`.

And, of course, you can add any other tools and libraries you want at
this point.

Also, to get sensible USB support, you'll need a lot more devices.  You
could try to put udev (and the necessary configuration) into the
initramfs.  Alternatively, you *might* have luck using the new
devtmpfs, as long as you can live with all devices only having
permissions for root.  (We may well not bother having any non-root users
on the flight computer, so this should work fine.)

> > * In u-boot, tftp `uRamdisk` to the flight computer's memory.  `setenv
> >  bootargs rdinit=/bin/sh`, and booth with `bootm ${kernel_addr}
> >  address_of_uRamdisk ${fdt_addr}`.  This should bring up the busybox
> >  shell.

This still applies.

> > * Create `/etc/inittab` in the initramfs directory, with the single
> >  line `ttyPSC0::askfirst:/bin/sh`.  Re-create the initramfs and the
> >  `uRamdisk`.  tftp `uRamdisk` to the flight computer's memory,
> >  `setenv bootargs rdinit=/sbin/init`, and boot with `bootm` again.
> >  The flight computer should boot to busybox init, which starts a
> >  shell when you press enter.

Of course, you can use busybox's init to start anything else you like,
or you can use something else as /sbin/init.  Oh, and you might not
actually need to explicitly set rdinit=/sbin/init; the kernel should
default to that.

> > * Finally, in u-boot, tftp the uRamdisk again and flash it to the
> >  appropriate partition in the onboard flash.  Test booting this with
> >  `bootm`.  Create a new boot macro with `setenv flash_initramfs
> >  "setenv bootargs rdinit=/sbin/init ; bootm ${kernel_addr}
> >  ${ramdisk_addr} ${fdt_addr}"` and set the flight computer to boot
> >  this by default with `setenv bootcmd "run flash_initramfs"`.

This still applies.

> > * The flight computer will now boot unattended into the Linux 2.6
> >  kernel and busybox init, and interact over the serial console on
> >  PSC0.

Hopefully you can now get to this point with 2.6.31. :)

- Josh Triplett

psas-avionics mailing list

Reply via email to