#!/bin/sh

set -x -e

tmpdir=`pwd`/kernel-packages.$$

kernel_src_tree=$1
kernel_version=$2
mach_type=$3
hh_suffix_version=12
if [ "$hh_suffix" == "0" -o -n "$hh_suffix" ]; then
  suffix=
else
  suffix=".${hh_suffix_version}"
fi

kernel_major=`egrep '^VERSION = ' $kernel_src_tree/Makefile | sed 's/VERSION = //'`
kernel_minor=`egrep '^PATCHLEVEL = ' $kernel_src_tree/Makefile | sed 's/PATCHLEVEL = //'`
kernel_micro=`egrep '^SUBLEVEL = ' $kernel_src_tree/Makefile | sed 's/SUBLEVEL = //'`
kernel_extra=`egrep '^EXTRAVERSION = ' $kernel_src_tree/Makefile | sed 's/EXTRAVERSION = //'`
kernel_version="$kernel_major.$kernel_minor.$kernel_micro$kernel_extra"
echo "kernel_version=$kernel_version"

. $kernel_src_tree/.config
if [ "$CONFIG_ARCH_SA1100" = "y" ] ; then
    if [ "$CONFIG_SA1100_JORNADA720" = "y" ] ; then
	mach_type="j720"
	architecture="j720"
    else
	mach_type="sa"
	architecture="ipaqsa"
    fi
fi
if [ "$CONFIG_ARCH_PXA" = "y" ] ; then
    architecture="ipaqpxa"
    mach_type="pxa"
fi
if [ "$CONFIG_ARCH_FOOTBRIDGE" = "y" ] ; then
    if [ $"CONFIG_ARCH_PERSONAL_SERVER" = "y" ] ; then
	architecture="skiff"
	mach_type="skiff"
    fi
fi

echo "mach_type=$mach_type"
echo "architecture=$architecture"

case "$architecture" in
    ipaqsa) ;;
    ipaqpxa*) ;;
    j720) ;;
    skiff) ;;
    *)
	echo "usage: $0 kernel_dir kernel_version architecture"
	echo "       where architecture is one of ipaqsa, ipaqpxa, or j720"
	exit -1
	;;
esac

kernel_priority=`echo $kernel_version | sed 's/2.4.//' |  sed 's/2.5.//' | sed 's/-.*$//'`
kernel_major=`echo $kernel_version | sed 's/\([0-9]\).*/\1/'`
kernel_minor=`echo $kernel_version | sed 's/[0-9].\([[:digit:]]\).*/\1/'`
kernel_micro=`echo $kernel_version | sed 's/[0-9].[0-9].\([0-9]*\).*/\1/'`
rmk_version=`echo $kernel_version | sed -e 's/.*rmk\([0-9]*\).*/\1/'`
pxa_version=`echo $kernel_version | sed -e 's/.*pxa\([0-9]*\).*/\1/'`
hh_version=`echo $kernel_version | sed -e 's/.*hh\([0-9]*\).*/\1/'`
echo 
echo $kernel_major $kernel_minor $kernel_micro $rmk_version $pxa_version $hh_version
kernel_priority=`expr $kernel_major "*" 1000000000 "+" $kernel_minor "*" 100000000 "+" $kernel_micro "*" 1000000 "+" $rmk_version "*" 100000 "+" $pxa_version "*" 10000 "+" $hh_version "*" 100 "+" $hh_suffix_version`
echo kernel_priority=$kernel_priority

if [ -z "$kernel_version" -o ! -d "$kernel_src_tree" ]; then
	echo "Usage: $0 <kernel_src_tree> <kernel_version> <ipkg_version>"
	exit 1
fi

cp $kernel_src_tree/arch/arm/boot/zImage zImage-$architecture-$kernel_version$suffix
cp $kernel_src_tree/System.map System-map-$architecture-$kernel_version$suffix.txt
tar -zcvf kernel-headers-$architecture-$kernel_version$suffix.tar.gz -C $kernel_src_tree include
cp $kernel_src_tree/.config config-$architecture-$kernel_version$suffix.txt

package_srcs=""
mkdir -p $tmpdir

pushd $tmpdir


##
## category_modules <categoryname> <description> <moredepends> <moddir1> <moddir2> ... 
##
category_modules () {
    local category
    local description
    local otherdepends
    category=$1
    shift
    description=$1
    shift
    otherdepends=$1
    shift
    mod_dirs="$*"

    local cm_ipkg_src
    cm_ipkg_src=$tmpdir/$category-modules-$kernel_version

    package_srcs="$package_srcs $cm_ipkg_src"

    mkdir $cm_ipkg_src
    pushd $cm_ipkg_src

    mkdir CONTROL

    moredepends=""
    if [ ! "$otherdepends" = "nodepends" ] ; then
      for od in $otherdepends ; do
        moredepends="$moredepends, $od-modules(>= $kernel_version)"
      done
    fi

    echo moredepends=$moredepends
    cat <<EOF | sed "s/@@KERNELVERSION@@/$kernel_version$suffix/g; s/@@KERNELPRIORITY@@/$kernel_priority/g; s/@@CATEGORY@@/$category/g; s/@@MOREDEPENDS@@/$moredepends/g; s/@@MACHTYPE@@/$mach_type/g; s/@@ARCHITECTURE@@/$architecture/g; s/@@REPLACES@@/$replaces/g;" > CONTROL/control
Package: @@CATEGORY@@-modules
Section: kernel
Essential: no
Priority: optional
Version: @@KERNELVERSION@@
Source: cvs://pserver:anoncvs@handhelds.org:/cvs;module=linux/kernel
Architecture: @@ARCHITECTURE@@
Maintainer: Jamey Hicks <jamey.hicks@hp.com>
Depends: kernel-modules(>= @@KERNELVERSION@@)@@MOREDEPENDS@@
Replaces: @@CATEGORY@@-modules-@@MACHTYPE@@ @@REPLACES@@
Provides: @@CATEGORY@@-modules
Description: @@CATEGORY@@ modules for kernel @@KERNELVERSION@@
EOF
    echo "  " $description >> CONTROL/control

    controldir=$PWD/CONTROL

    mkdir -p etc/modutils

    mod_base=lib/modules/$kernel_version
    mkdir -p $mod_base
    cd $mod_base

    for mod in $mod_dirs; do
      mod_dir1=`dirname $mod`
      if [ -d $module_source/$mod -o -f $module_source/$mod ] ; then
        mkdir -p $mod_dir1
        mv $module_source/$mod $mod_dir1
      fi
    done

    cat <<EOF > $controldir/postinst
#!/bin/sh

if [ \`uname -r\` = $kernel_version ]; then
  depmod -a
fi

if [ -x /usr/bin/update-modules ] ; then
   /usr/bin/update-modules
fi
EOF
    ## find . -name '*.o' -exec echo  /$mod_base/{} \\ \; >> $controldir/postinst
    ## echo >> $controldir/postinst
    chmod agu+rx $controldir/postinst

    cat <<EOF > $controldir/postrm
#!/bin/sh
if [ -x /usr/bin/update-modules ] ; then
   /usr/bin/update-modules
fi
EOF
    chmod agu+rx $controldir/postrm

    popd
}

##
## autoload <categoryname> modules ...
##
autoload() {
	category=$1
	insmod=""
	shift
	cat <<EOF >> $category-modules-$kernel_version/CONTROL/postinst
if [ ! -x /usr/bin/update-modules ]; then
EOF
	while [ $# -gt 0 ]; do
		echo $1 >> $category-modules-$kernel_version/etc/modutils/$category-modules
		cat <<EOF >> $category-modules-$kernel_version/CONTROL/postinst
   if ! grep -q $1 \$IPKG_OFFLINE_ROOT/etc/modules ; then
      echo $1 >> \$IPKG_OFFLINE_ROOT/etc/modules
   fi
EOF
		insmod="modprobe $1 || true\n$insmod"
		shift
	done

	echo "fi" >> $category-modules-$kernel_version/CONTROL/postinst
        if [ "x$insmod" != "x" ]; then
		echo "if [ \`uname -r\` = $kernel_version ]; then" >> $category-modules-$kernel_version/CONTROL/postinst
		echo -e $insmod >> $category-modules-$kernel_version/CONTROL/postinst
		echo "fi" >> $category-modules-$kernel_version/CONTROL/postinst
	fi
}

##
## modconf <categoryname> <string> ...
##
modconf() {
	category=$1
	shift
	cat <<EOF >> $category-modules-$kernel_version/CONTROL/postinst
if [ ! -x /usr/bin/update-modules ]; then
EOF
	while [ $# -gt 0 ]; do
		theline=$1
		echo $theline >> $category-modules-$kernel_version/etc/modutils/$category-modules.conf
cat <<EOF >> $category-modules-$kernel_version/CONTROL/postinst
  if ! grep -q "$theline" \$IPKG_OFFLINE_ROOT/etc/modules.conf ; then
     echo "$theline" >> $IPKG_OFFLINE_ROOT/etc/modules.conf
  fi
EOF
		shift
	done
	cat <<EOF >> $category-modules-$kernel_version/CONTROL/postinst
fi
EOF
}

############################################################ 

kernel_ipkg_src=$tmpdir/kernel-$kernel_version

mkdir $kernel_ipkg_src
pushd $kernel_ipkg_src

mkdir CONTROL

cat <<EOF | sed "s/@@KERNELVERSION@@/$kernel_version$suffix/g; s/@@MACHTYPE@@/$mach_type/g; s/@@ARCHITECTURE@@/$architecture/g;" > CONTROL/control
Package: kernel
Provides: kernel
Section: kernel
Essential: no
Priority: required
Version: @@KERNELVERSION@@
Source: cvs://pserver:anoncvs@handhelds.org:/cvs;module=linux/kernel
Architecture: @@ARCHITECTURE@@
Replaces: kernel-@@MACHTYPE@@
Maintainer: Jamey Hicks <jamey.hicks@hp.com>
Depends: kernel-modules(>= @@KERNELVERSION@@)
Description: kernel for kernel @@KERNELVERSION@@
  This package contains the kernel image built for
  useful within familiar. 
EOF

cat <<EOF | sed "s/@@KERNELVERSION@@/$kernel_version$suffix/g; s/@@KERNELPRIORITY@@/$kernel_priority/g; s/@@MACHTYPE@@/$mach_type/g; s/@@ARCHITECTURE@@/$architecture/g;" > CONTROL/postinst
#!/bin/sh

zimage="zImage-@@KERNELVERSION@@"
tmpkernelfile="/boot/$zimage"
if [ -d /boot ] ; then
    update-alternatives --install /boot/zImage zImage /boot/zImage-@@KERNELVERSION@@ @@KERNELPRIORITY@@ || true
else
  cat /proc/mtd | while read mtddev size esize quotedename ; do
    echo $mtddev | sed "s/mtd//" | sed "s/://" | read mtddevnum
    echo $quotedname | sed "s/\"//g" | read name
    if [ "$name" = "kernel" ] ; then
      mknod /tmp/mtdblock$mtddevnum b 31 $mtddevnum
      cat /boot/zImage-@@KERNELVERSION@@ > /dev/mtdblock/$mtddevnum
      rm /boot/zImage-@@KERNELVERSION@@
    fi
  done
fi 
EOF
chmod agu+rx CONTROL/postinst

cat <<EOF | sed "s/@@KERNELVERSION@@/$kernel_version$suffix/g; s/@@KERNELPRIORITY@@/$kernel_priority/g; s/@@MACHTYPE@@/$mach_type/g; s/@@ARCHITECTURE@@/$architecture/g;" > CONTROL/postrm
#!/bin/sh

zimage="zImage-@@KERNELVERSION@@"
tmpkernelfile="/boot/$zimage"
if [ -d /boot ] ; then
    update-alternatives --remove zImage /boot/zImage-@@KERNELVERSION@@ || true
fi 
EOF
chmod agu+rx CONTROL/postrm

############################################################

#
# Pull the modules out of the kernel.
#
mkdir boot

cp $kernel_src_tree/arch/arm/boot/zImage boot/zImage-$kernel_version$suffix
popd

############################################################ 

km_ipkg_src=$tmpdir/kernel-modules-$kernel_version

mkdir $km_ipkg_src
pushd $km_ipkg_src

mkdir CONTROL

cat <<EOF | sed "s/@@KERNELVERSION@@/$kernel_version$suffix/g; s/@@KERNELBASEVERSION@@/$kernel_version/g; s/@@MACHTYPE@@/$mach_type/g; s/@@ARCHITECTURE@@/$architecture/g;" > CONTROL/control
Package: kernel-modules
Provides: kernel-modules
Section: kernel
Essential: no
Priority: required
Version: @@KERNELVERSION@@
Architecture: @@ARCHITECTURE@@
Source: cvs://pserver:anoncvs@handhelds.org:/cvs;module=linux/kernel
Maintainer: Jamey Hicks <jamey.hicks@hp.com>
Depends: modutils, kernel (>= @@KERNELBASEVERSION@@)
Replaces: kernel-modules-@@MACHTYPE@@
Description: kernel modules for kernel @@KERNELVERSION@@
  This package contains almost all of the kernel modules that might be
  useful within familiar. Eventually I would like to split many of
  these modules off into their own packages that would have dependency
  links from the programs that need them. For example, e2fsprogs could
  depend on e2fs-kernel-modules or something like that. I have already
  split off cpu-scale and the pcmcia modules into their own packages.
EOF

mkdir -p etc/modutils
cat <<EOF > etc/modutils/kernel-modules
ipaq-sleeve
sa1100-rtc
usb-eth
EOF
if [ "$architecture" == "ipaqpxa" ]; then
echo "h5400_buzzer" >> etc/modutils/kernel-modules
fi
cat <<EOF > etc/modutils/kernel-modules.conf
alias usbf usb-eth
alias ipaq_hal_3600 h3600_micro
alias ipaq_hal_3100 h3600_micro
alias ipaq_hal_3800 h3600_asic
alias ipaq_hal_3900 h3900_asic
alias ipaq_hal_5400 h5400_asic
EOF

cat <<EOF | sed "s/@@KERNELVERSION@@/$kernel_version$suffix/g; s/@@MACHTYPE@@/$mach_type/g; s/@@ARCHITECTURE@@/$architecture/g;" > CONTROL/postinst
#!/bin/sh

if [ -x /usr/bin/update-modules ] ; then
    update-modules
else
   if grep -q ipaq-sleeve $IPKG_OFFLINE_ROOT/etc/modules ; then
       true
   else
       echo ipaq-sleeve >> $IPKG_OFFLINE_ROOT/etc/modules
   fi
   if grep -q usb-eth $IPKG_OFFLINE_ROOT/etc/modules.conf ; then
       true
   else
       echo 'alias usbf usb-eth' >> $IPKG_OFFLINE_ROOT/etc/modules.conf
   fi
fi
EOF
chmod agu+rx CONTROL/postinst


mod_base=lib/modules/$kernel_version


#
# Pull the modules out of the kernel.
#
pushd $kernel_src_tree 

  INSTALL_MOD_PATH=$km_ipkg_src
  export INSTALL_MOD_PATH

  ( make -k modules_install )

  ## remove the obsolete pcmcia/foo.o symbolic links
  rm -fr $km_ipkg_src/$mod_base/pcmcia

  ## but keep the packages insmoded by cardmgr  
  mkdir -p $km_ipkg_src/$mod_base/pcmcia
  pushd $km_ipkg_src/$mod_base/pcmcia
    ln -s ../kernel/drivers/pcmcia/ds.o .
    if [ -e ../kernel/drivers/pcmcia/sa1100_cs.o ]; then
      ln -s ../kernel/drivers/pcmcia/sa1100_cs.o .
    fi
    if [ -e ../kernel/drivers/pcmcia/pxa/pxa.o ]; then
      ln -s ../kernel/drivers/pcmcia/pxa/pxa.o .
    fi
    ln -s ../kernel/drivers/pcmcia/pcmcia_core.o .
  popd

popd

#
# Clean up kernel-modules
# 

module_source=$km_ipkg_src/$mod_base

cd $module_source

pwd
rm -f build

for file in modules.*
do
    rm -f $file
    ln -s /var/run/$file $file
done

popd

## let's keep hwtimer and profiler in kernel-modules
category_modules hwtimer "SA1100 hwtimer support." nodepends kernel/arch/arm/mach-sa1100/hwtimer.o
category_modules profiler "Sampling profiler support." hwtimer kernel/drivers/char/profiler.o
category_modules devmapper "Device mapper support." nodepends kernel/drivers/md/dm-mod.o kernel/mm/mempool.o
category_modules lvm "Logical volume manager support." nodepends kernel/drivers/md/lvm-mod.o

if [ "$architecture" = "ipaqsa" ] ; then
  # H3800 specifics
  category_modules h3800 "Driver modules for iPAQ H3800 that are not useful on older units" nodepends kernel/arch/arm/mach-sa1100/h3600_asic.o kernel/drivers/mmc/mmc_base.o kernel/drivers/serial/serial_h3800.o
else
  # h3900 and h5400 stuff goes here when we port to the h1900
  true
fi

#
# Setup irda-modules
#

category_modules irda "The entire suite of kernel modules required to use both SIR and FIR
  IrDA.  This includes IrCOMM, and IrLAN support." nodepends \
 kernel/drivers/net/irda \
 kernel/net/irda

if [ "$architecture" = "ipaqsa" ] ; then
modconf irda "alias irda0 sa1100_ir"
else
modconf irda "alias irda0 pxa_ir"
fi
autoload irda ircomm-tty

category_modules smbfs "SMB filesystem support." nodepends kernel/fs/smbfs
category_modules nfs "NFS filesystem client support." nodepends kernel/net/sunrpc kernel/fs/nfs kernel/fs/lockd
category_modules nfsd "NFS filesystem server support." nfs kernel/fs/nfsd 
category_modules cramfs "CRAMFS filesystem support." nodepends kernel/fs/cramfs
category_modules isofs "CRAMFS filesystem support." nodepends kernel/fs/isofs
category_modules loopback "Loopback device support." nodepends kernel/drivers/block/loop.o
category_modules mbd "Network block device support." nodepends kernel/drivers/block/nbd.o

category_modules backpaq "Mercury BackPAQ driver support." "pcmcia videodev" \
    kernel/drivers/pcmcia/h3600_backpaq.o \
    kernel/drivers/char/h3600_backpaq_accel.o \
    kernel/drivers/char/h3600_backpaq_sram.o \
    kernel/arch/arm/mach-sa1100/h3600_backpaq_fpga.o \
    kernel/drivers/char/h3600_backpaq_fpga.o \
    kernel/drivers/char/h3600_backpaq_gasgauge.o \
    kernel/drivers/mtd/h3600_backpaq_flash.o \
    kernel/drivers/media/video/h3600_backpaq_camera.o

autoload backpaq h3600_backpaq

category_modules iptables "ipv4 netfilter and iptables support." nodepends kernel/net/ipv4/netfilter
category_modules iptables-ipv6 "ipv6 netfilter and iptables support." ipv6 kernel/net/ipv6/netfilter
if [ "$architecture" != "ipaqpxa" ]; then
category_modules stowaway "Stowaway keyboard support." nodepends kernel/drivers/char/h3600_stowaway.o
category_modules microkbd "Compaq Microkeyboard support." nodepends kernel/drivers/char/h3600_microkbd.o
fi
category_modules input "Linux input drivers." nodepends kernel/drivers/input kernel/drivers/char/joystick/serio.o kernel/drivers/char/joystick/serport.o
category_modules newtonkbd "Newton keyboard support." input kernel/drivers/char/newtonkbd.o
category_modules ext2 "EXT2 filesystem support." nodepends kernel/fs/ext2
category_modules ext3 "EXT3 filesystem support." nodepends kernel/fs/ext3 kernel/fs/jbd
category_modules reiserfs "Reiser journaling filesystem support" nodepends kernel/fs/reiserfs
category_modules vfat "VFAT filesystem support." nodepends kernel/fs/fat kernel/fs/vfat
category_modules msdos "MSDOS filesystem support." vfat kernel/fs/msdos
category_modules umsdos "Unix MSDOS filesystem support." vfat kernel/fs/umsdos

category_modules nls-base "NLS codepage for nls-base" nodepends kernel/fs/nls/nls_base.o
category_modules nls-big5 "NLS codepage for nls-big5" nls-base kernel/fs/nls/nls_big5.o
category_modules nls-cp1250 "NLS codepage for nls-cp1250" nls-base kernel/fs/nls/nls_cp1250.o
category_modules nls-cp1251 "NLS codepage for nls-cp1251" nls-base kernel/fs/nls/nls_cp1251.o
category_modules nls-cp1255 "NLS codepage for nls-cp1255" nls-base kernel/fs/nls/nls_cp1255.o
category_modules nls-cp437 "NLS codepage for nls-cp437" nls-base kernel/fs/nls/nls_cp437.o
category_modules nls-cp737 "NLS codepage for nls-cp737" nls-base kernel/fs/nls/nls_cp737.o
category_modules nls-cp775 "NLS codepage for nls-cp775" nls-base kernel/fs/nls/nls_cp775.o
category_modules nls-cp850 "NLS codepage for nls-cp850" nls-base kernel/fs/nls/nls_cp850.o
category_modules nls-cp852 "NLS codepage for nls-cp852" nls-base kernel/fs/nls/nls_cp852.o
category_modules nls-cp855 "NLS codepage for nls-cp855" nls-base kernel/fs/nls/nls_cp855.o
category_modules nls-cp857 "NLS codepage for nls-cp857" nls-base kernel/fs/nls/nls_cp857.o
category_modules nls-cp860 "NLS codepage for nls-cp860" nls-base kernel/fs/nls/nls_cp860.o
category_modules nls-cp861 "NLS codepage for nls-cp861" nls-base kernel/fs/nls/nls_cp861.o
category_modules nls-cp862 "NLS codepage for nls-cp862" nls-base kernel/fs/nls/nls_cp862.o
category_modules nls-cp863 "NLS codepage for nls-cp863" nls-base kernel/fs/nls/nls_cp863.o
category_modules nls-cp864 "NLS codepage for nls-cp864" nls-base kernel/fs/nls/nls_cp864.o
category_modules nls-cp865 "NLS codepage for nls-cp865" nls-base kernel/fs/nls/nls_cp865.o
category_modules nls-cp866 "NLS codepage for nls-cp866" nls-base kernel/fs/nls/nls_cp866.o
category_modules nls-cp869 "NLS codepage for nls-cp869" nls-base kernel/fs/nls/nls_cp869.o
category_modules nls-cp874 "NLS codepage for nls-cp874" nls-base kernel/fs/nls/nls_cp874.o
category_modules nls-cp932 "NLS codepage for nls-cp932" nls-base kernel/fs/nls/nls_cp932.o
category_modules nls-cp936 "NLS codepage for nls-cp936" nls-base kernel/fs/nls/nls_cp936.o
category_modules nls-cp949 "NLS codepage for nls-cp949" nls-base kernel/fs/nls/nls_cp949.o
category_modules nls-cp950 "NLS codepage for nls-cp950" nls-base kernel/fs/nls/nls_cp950.o
category_modules nls-euc-jp "NLS codepage for nls-euc-jp" nls-base kernel/fs/nls/nls_euc-jp.o
category_modules nls-euc-kr "NLS codepage for nls-euc-kr" nls-base kernel/fs/nls/nls_euc-kr.o
category_modules nls-gb2312 "NLS codepage for nls-gb2312" nls-base kernel/fs/nls/nls_gb2312.o
category_modules nls-iso8859-13 "NLS codepage for nls-iso8859-13" nls-base kernel/fs/nls/nls_iso8859-13.o
category_modules nls-iso8859-14 "NLS codepage for nls-iso8859-14" nls-base kernel/fs/nls/nls_iso8859-14.o
category_modules nls-iso8859-15 "NLS codepage for nls-iso8859-15" nls-base kernel/fs/nls/nls_iso8859-15.o
category_modules nls-iso8859-1 "NLS codepage for nls-iso8859-1" nls-base kernel/fs/nls/nls_iso8859-1.o
category_modules nls-iso8859-2 "NLS codepage for nls-iso8859-2" nls-base kernel/fs/nls/nls_iso8859-2.o
category_modules nls-iso8859-3 "NLS codepage for nls-iso8859-3" nls-base kernel/fs/nls/nls_iso8859-3.o
category_modules nls-iso8859-4 "NLS codepage for nls-iso8859-4" nls-base kernel/fs/nls/nls_iso8859-4.o
category_modules nls-iso8859-5 "NLS codepage for nls-iso8859-5" nls-base kernel/fs/nls/nls_iso8859-5.o
category_modules nls-iso8859-6 "NLS codepage for nls-iso8859-6" nls-base kernel/fs/nls/nls_iso8859-6.o
category_modules nls-iso8859-7 "NLS codepage for nls-iso8859-7" nls-base kernel/fs/nls/nls_iso8859-7.o
category_modules nls-iso8859-8 "NLS codepage for nls-iso8859-8" nls-base kernel/fs/nls/nls_iso8859-8.o
category_modules nls-iso8859-9 "NLS codepage for nls-iso8859-9" nls-base kernel/fs/nls/nls_iso8859-9.o
category_modules nls-koi8-r "NLS codepage for nls-koi8-r" nls-base kernel/fs/nls/nls_koi8-r.o
category_modules nls-koi8-ru "NLS codepage for nls-koi8-ru" nls-base kernel/fs/nls/nls_koi8-ru.o
category_modules nls-koi8-u "NLS codepage for nls-koi8-u" nls-base kernel/fs/nls/nls_koi8-u.o
category_modules nls "NLS codepage for nls" nls-base kernel/fs/nls/nls.o
category_modules nls-sjis "NLS codepage for nls-sjis" nls-base kernel/fs/nls/nls_sjis.o
category_modules nls-tis-620 "NLS codepage for nls-tis-620" nls-base kernel/fs/nls/nls_tis-620.o
category_modules nls-utf8 "NLS codepage for nls-utf8" nls-base kernel/fs/nls/nls_utf8.o

category_modules netlink "Netlink support." nodepends kernel/net/netlink
category_modules packet "Raw IP packet support." nodepends kernel/net/packet

modconf packet "alias net-pf-17 af_packet"

category_modules ohci "OHCI drivers" usb kernel/drivers/usb/usb-ohci.o kernel/drivers/usb/usb-ohci-h5400.o
autoload ohci usb-ohci-h5400
category_modules usb-hid "USB HID drivers" input kernel/drivers/usb/hid.o
autoload usb-hid hid keybdev mousedev
category_modules usb-storage "USB storage drivers" scsi kernel/drivers/usb/storage/usb-storage.o
autoload usb-storage usb-storage sd_mod
category_modules pwc "PWC Video For Linux driver" "videodev usb" kernel/drivers/usb/pwc.o
category_modules quickcam "Quickcam Video For Linux driver" "videodev usb" kernel/drivers/usb/quickcam.o
category_modules ov511 "OV511 Video For Linux driver" "videodev usb" kernel/drivers/usb/ov511.o
category_modules ibmcam "IBM C-it Video For Linux driver" "videodev usb" kernel/drivers/usb/ibmcam.o kernel/drivers/usb/usbvideo.o
category_modules vicam "3Com HomeConnect Video For Linux driver" "videodev usb" kernel/drivers/usb/vicam.o
category_modules stv680 "STV680 Video For Linux driver" "videodev usb" kernel/drivers/usb/stv680.o
category_modules se401 "SE401 Video For Linux driver" "videodev usb" kernel/drivers/usb/se401.o
category_modules ultracam "Ultracam Video For Linux driver" "videodev usb" kernel/drivers/usb/ultracam.o
category_modules usb "USB drivers" nodepends kernel/drivers/usb
category_modules mipv6 "IPv6 mobility support." ipv6 kernel/net/ipv6/mobile_ip6
category_modules ipv6 "IPv6 networking support." nodepends kernel/net/ipv6
autoload ipv6 ipv6
category_modules ipsec "ipsec support." nodepends kernel/net/ipsec
category_modules tun "ethertun/tap support." nodepends kernel/drivers/net/tun.o
category_modules bridge "Ethernet bridging support." nodepends kernel/net/bridge/bridge.o

category_modules hamradio "Hamradio AX.25 support." nodepends kernel/drivers/net/hamradio

category_modules videodev "Video For Linux driver." nodepends kernel/drivers/media/video/videodev.o
category_modules videodevx "Video For Linux 2 driver." nodepends kernel/drivers/media/video/videodevx.o kernel/drivers/media/video/v4l_compat.o
category_modules winnov "Winnov Videum PCMCIA Video For Linux driver." videodevx kernel/drivers/media/video/wnv_cs.o
category_modules cpia "CPiA Video For Linux driver" videodev kernel/drivers/media/video/cpia.o
category_modules cpia-usb "CPiA USB Video For Linux driver" "videodev usb" kernel/drivers/media/video/cpia_usb.o

if [ "$architecture" != "ipaqpxa" ]; then
category_modules lirc "Linux Consumer IR drivers." nodepends kernel/drivers/char/lirc_sir.o
fi

## pcmcia ethernet cards
category_modules 3c589 "3COM 3c589_cs driver." "packet pcmcia" kernel/drivers/net/pcmcia/3c589_cs.o pcmcia/3c589_cs.o
category_modules 3c574 "3COM 3c574_cs driver." "packet pcmcia" kernel/drivers/net/pcmcia/3c574_cs.o pcmcia/3c574_cs.o
category_modules 8390 "8390 network device driver." nodepends kernel/drivers/net/8390.o
category_modules pcnet "pcnet_cs (NE2000 compatible) driver." "packet pcmcia 8390" kernel/drivers/net/pcmcia/pcnet_cs.o pcmcia/pcnet_cs.o
category_modules fmvj18x "fjvj18x_cs driver." "packet pcmcia" kernel/drivers/net/pcmcia/fmvj18x_cs.o pcmcia/fmvj18x_cs.o
category_modules nmclan "nmclan driver" "packet pcmcia" kernel/drivers/net/pcmcia/nmclan_cs.o pcmcia/nmclan_cs.o
category_modules smc91c92 "smc91c92 driver" "packet pcmcia" kernel/drivers/net/pcmcia/smc91c92_cs.o pcmcia/smc91c92_cs.o
category_modules xirc2ps "xirc2ps driver" "packet pcmcia" kernel/drivers/net/pcmcia/xirc2ps_cs.o pcmcia/xirc2ps_cs.o

## pcmcia serial cards
category_modules serial "serial_cs driver" pcmcia kernel/drivers/char/pcmcia/serial_cs.o pcmcia/serial_cs.o
category_modules parport "parport_cs driver" nodepends kernel/drivers/parport

## 802.11b cards 
category_modules wvlan "Lucent 802.11b (wvlan) drivers." "netlink packet pcmcia" kernel/drivers/net/wireless/wvlan_cs.o pcmcia/wvlan_cs.o
category_modules mwvlan "Lucent 802.11b (mwvlan) monitor-mode drivers." "netlink packet pcmcia" kernel/drivers/net/wireless/mwvlan_cs.o pcmcia/mwvlan_cs.o
replaces=prism2-modules
category_modules hostap "Hostap 802.11b drivers." "netlink packet pcmcia" \
    kernel/drivers/net/wireless/hostap.o \
    kernel/drivers/net/wireless/hostap_crypt.o \
    kernel/drivers/net/wireless/hostap_crypt_wep.o \
    pcmcia/prism2.o kernel/drivers/net/wireless/hostap_cs.o
unset replaces
modconf hostap "options hostap_cs ignore_cis_vcc=1"

category_modules orinoco "802.11b (orinoco) drivers should support both Lucent and Intersil chipsets." "netlink packet pcmcia" \
    kernel/drivers/net/wireless/orinoco_cs.o \
    kernel/drivers/net/wireless/orinoco.o \
    kernel/drivers/net/wireless/hermes.o
modconf orinoco "options orinoco_cs ignore_cis_vcc=1"

category_modules aironet "aironet driver" "packet pcmcia" kernel/drivers/net/wireless/airo.o kernel/drivers/net/wireless/airo_cs.o pcmcia/airo_cs.o
category_modules spectrum24 "spectrum24" "packet pcmcia" kernel/drivers/net/wireless/spectrum24t_cs.o
category_modules mwavelan "mwavelan" "packet pcmcia" kernel/drivers/net/wireless/mwavelan_cs.o
category_modules atmel-pcmcia "atmel wlan drivers" "packet pcmcia" kernel/drivers/net/wireless/atmel/Pcmcia_Pci
mkdir -p atmel-pcmcia-modules-$kernel_version/etc/pcmcia
cat <<EOF >> atmel-pcmcia-modules-$kernel_version/etc/pcmcia/atmel-wlan.conf
device "pcmf502rd"
  class "network" module "pcmf502rd"

card "Actiontec 802CAT1"
  version "WLAN", "802.11b PC CARD"
  bind "pcmf502rd"
EOF
cat <<EOF >> atmel-pcmcia-modules-$kernel_version/CONTROL/postinst
killall -1 cardmgr || true
EOF
cat <<EOF >> atmel-pcmcia-modules-$kernel_version/CONTROL/postrm
killall -1 cardmgr || true
EOF
category_modules atmel-usb "atmel wlan drivers" "packet usb" kernel/drivers/net/wireless/atmel/usb
autoload atmel-usb usbvnetr

category_modules axnet "axnet drivers." "packet pcmcia" kernel/drivers/net/pcmcia/axnet_cs.o
category_modules ray "ray drivers." "packet pcmcia" kernel/drivers/net/pcmcia/ray_cs.o
category_modules netwave "netwave drivers." "packet pcmcia" kernel/drivers/net/pcmcia/netwave_cs.o
category_modules wavelan "non-802.11 wavelan drivers." "packet pcmcia" kernel/drivers/net/pcmcia/wavelan_cs.o

category_modules bluetooth-bt3c "3Com bt3c support" "bluetooth" kernel/drivers/bluetooth/bt3c_cs.o
category_modules bluetooth-dtl1 "DTL1 support" "bluetooth" kernel/drivers/bluetooth/dtl1_cs.o
category_modules bluetooth-bluecard "Anycom Bluecard support" "bluetooth" kernel/drivers/bluetooth/bluecard_cs.o
category_modules bluetooth-uart "Generic UART HCI support" "bluetooth" kernel/drivers/bluetooth/hci_uart.o
category_modules bluetooth-btuart "PC Card UART HCI support" "bluetooth" kernel/drivers/bluetooth/btuart_cs.o

category_modules bluetooth "bluetooth support" "" \
    kernel/net/bluetooth \
    kernel/drivers/bluetooth

autoload bluetooth hci_uart l2cap bnep bluez
modconf bluetooth "alias net-pf-31 bluez"
modconf bluetooth "alias bt-proto-0 l2cap"
modconf bluetooth "alias bt-proto-2 sco"
modconf bluetooth "alias bt-proto-3 rfcomm"
modconf bluetooth "alias bt-proto-4 bnep"
modconf bluetooth "alias tty-ldisc-15 hci_uart"

if [ "$architecture" = "ipaqpxa" ]; then
  category_modules pxa-i2s "PXA I2S (generic) support" nodepends kernel/drivers/sound/pxa-i2s.o
  sound_depends="pxa-i2s"
else
  sound_depends=""
fi
category_modules sound "Sound support" $sound_depends kernel/drivers/sound
if [ "$architecture" = "ipaqpxa" -o "$architecture" = "ipaqpxa255" ] ; then
   # don't autoload h3900-uda1380, we will use alsa on those machines
   autoload sound h5400-audio
   modconf sound "options i2c-algo-pxa pxa_scan=0"
else
   autoload sound h3600-uda1341
fi

category_modules ppp "PPP support" nodepends \
    kernel/drivers/net/ppp_generic.o \
    kernel/drivers/net/slhc.o \
    kernel/drivers/net/ppp_async.o \
    kernel/drivers/net/ppp_deflate.o \
    kernel/drivers/net/bsd_comp.o
modconf ppp "alias tty-ldisc-3 ppp_async"
modconf ppp "alias tty-ldisc-4 ppp_synctty"
modconf ppp "alias ppp0 ppp_async"

category_modules cdrom "CD-ROM driver" nodepends kernel/drivers/cdrom/cdrom.o

category_modules scsi "SCSI support" cdrom kernel/drivers/scsi
category_modules barcode "Barcode scanner support" nodepends kernel/drivers/char/pcmcia/sdgmhsgpl_cs.o

## must be after individual pcmcia driver packages
category_modules pcmcia "Miscellaneous PCMCIA drivers." nodepends \
 pcmcia \
 kernel/drivers/pcmcia \
 kernel/drivers/char/pcmcia \
 kernel/drivers/net/pcmcia \
 kernel/drivers/char/serial.o

if [ "$architecture" = "ipaqsa" ] ; then
   autoload pcmcia sa1100_cs h3600_generic_sleeve ds
else
   autoload pcmcia pxa_cs h3600_generic_sleeve ds
fi

modconf pcmcia "options pcmcia_core ignore_cis_vcc=1"

## after pcmcia modules
category_modules ide-nondisk "IDE cd, tape, and floppy support" pcmcia cdrom \
    kernel/drivers/ide/ide-cd.o \
    kernel/drivers/ide/ide-tape.o \
    kernel/drivers/ide/ide-floppy.o
category_modules ide "IDE support" pcmcia kernel/drivers/ide kernel/drivers/cdrom kernel/drivers/ide/ide-cs.o

############################################################

task_b=$tmpdir/task-bootstrap-$kernel_version
mkdir $task_b
pushd $task_b 

mkdir CONTROL

sound_modules="alsa-modules(>= 0.9.0rc7-$kernel_version)"

if [ "$architecture" = "ipaqsa" ] ; then
  extra_bootstrap=", h3800-modules(>= $kernel_version)"
else
  ## for h5400 internal wifi
  extra_bootstrap=", ohci-modules, at76c503a-modules"
fi

cat <<EOF | sed "s/@@SOUNDMODULES@@/$sound_modules/g; s/@@KERNELVERSION@@/$kernel_version$suffix/g; s/@@MACHTYPE@@/$mach_type/g; s/@@ARCHITECTURE@@/$architecture/g; s/@@EXTRA_BOOTSTRAP@@/$extra_bootstrap/g;" > CONTROL/control
Package: task-bootstrap
Provides: task-bootstrap
Section: kernel
Essential: no
Priority: optional
Version: @@KERNELVERSION@@
Architecture: @@ARCHITECTURE@@
Source: cvs://pserver:anoncvs@handhelds.org:/cvs;module=linux/kernel
Replaces: task-bootstrap-@@MACHTYPE@@
Maintainer: Jamey Hicks <jamey.hicks@hp.com>
Depends: task-essential-to-boot, familiar-base, ipkg, ipkg-arch, ipkg-conf, diff, hostname, kernel, lrzsz, hotplug, ppp, dropbear
Recommends: pcnet-modules, wvlan-modules, atmel-pcmcia-modules, orinoco-modules, hostap-modules, ide-modules, nfs-modules, ppp-modules, @@SOUNDMODULES@@, vfat-modules, aironet-modules, irda-modules, pcmcia-cs, wireless-tools, scp, bluetooth-modules, ipv6-modules, bluetooth-uart-modules@@EXTRA_BOOTSTRAP@@, portmap, module-init-tools
Description: kernel and modules required to bootstrap and install more packages
EOF

package_srcs="$package_srcs $task_b"
popd 

############################################################

task_i=$tmpdir/task-intimate-modules-$kernel_version
mkdir $task_i
pushd $task_i 

mkdir CONTROL

cat <<EOF | sed "s/@@KERNELVERSION@@/$kernel_version$suffix/g; s/@@MACHTYPE@@/$mach_type/g; s/@@ARCHITECTURE@@/$architecture/g;" > CONTROL/control
Package: task-intimate-modules
Section: kernel
Essential: no
Priority: optional
Version: @@KERNELVERSION@@
Architecture: @@ARCHITECTURE@@
Source: cvs://pserver:anoncvs@handhelds.org:/cvs;module=linux/kernel
Maintainer: Jamey Hicks <jamey.hicks@hp.com>
Replaces: task-intimate-@@MACHTYPE@@
Depends: task-bootstrap, wvlan-modules, pcnet-modules, reiserfs-modules, nfs-modules, ide-modules
Description: kernel and modules required to run Intimate
EOF

package_srcs="$package_srcs $task_i"
popd

############################################################
popd

ipkg-build -o root -g root $kernel_ipkg_src 
ipkg-build -o root -g root $km_ipkg_src 

for package_src in $package_srcs; do
  ipkg-build -o root -g root $package_src 
done

rm -rf $tmpdir

