|
|
(6 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
− | Désolé de pourrir les 'recent changes' :)
| + | Je suis Nicolas Duclos, j'ai 35 ans et je suis informaticien de formation avec un DESS (master) en info à Rennes. |
| + | |
| ==Truc utile== | | ==Truc utile== |
| ===GRUB sur clé USB=== | | ===GRUB sur clé USB=== |
| Voici une petite astuce pour : | | Voici une petite astuce pour : |
| * ne plus perdre GRUB lors de la réinstallation de Windows | | * ne plus perdre GRUB lors de la réinstallation de Windows |
− | * ne plus avoir accès à Windows après l'installation de Linux | + | * toujours accéder à Windows après l'(la ré-)installation de Linux... (oui oui ca arrive souvent :) ) |
| * rendre inaccessible la partition Linux sur votre machine | | * rendre inaccessible la partition Linux sur votre machine |
− | L'astuce est d'installer ''que'' GRUB sur une clé USB. '''Attention, l'ordre des actions est important''' | + | L'astuce est d'installer ''que'' GRUB sur une clé USB. |
| + | {{Note| l'ordre des actions est important}} |
| * Formater la cle USB en fat32 (gparted) | | * Formater la cle USB en fat32 (gparted) |
| * Récupérer la liste des disques monter ainsi que leur ID | | * Récupérer la liste des disques monter ainsi que leur ID |
Line 18: |
Line 20: |
| * installer Grub sur la clé USB | | * installer Grub sur la clé USB |
| <pre class="host"> | | <pre class="host"> |
− | $ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1 (remplacer sdb1 par la valeur récupérée avec la commande précédente) | + | $ grub-install --no-floppy --root-directory=/media/disk /dev/sdb1 (remplacer sdb1 par la valeur récupérée avec la commande précédente) |
| </pre> | | </pre> |
| * demonter le disque USB | | * demonter le disque USB |
Line 34: |
Line 36: |
| sudo apt-get install libgtk2.0-dev libglib2.0-dev libglade2-dev | | sudo apt-get install libgtk2.0-dev libglib2.0-dev libglade2-dev |
| </pre> | | </pre> |
− | ==Banc à sable== | + | ==Participation à la documentation Armadeus Project== |
− | | + | * [[Android]] |
− | Ce qui suit n'est qu'un brouillon avec les fautes de frappes et d'orthographes comme il se doit.
| + | |
− | | + | |
− | | + | |
− | ==Prerequisites for Linux installation==
| + | |
− | ===Install needed software packages===
| + | |
− | * Install these package for build the kernel image and for format the mmc/µSD card
| + | |
− | <pre class="host">
| + | |
− | $ sudo apt-get install uboot-mkimage mtd-utils
| + | |
− | </pre>
| + | |
− | * [[Toolchain]] | + | |
− | | + | |
− | ===Update the environment variables===
| + | |
− | Theses environment variables install the Android and Armadeus folder in our home directory, but of course, it can be placed anywhere!
| + | |
− | <pre class="config">
| + | |
− | export ANDROID_SOURCE=~/apf27droid
| + | |
− | export ANDROID_SDK=~/android-sdk-linux_x86-1.5_r3
| + | |
− | export ARMADEUS=~/armadeus-3.1
| + | |
− | export PATH=${PATH}:${ANDROID_SDK}/tools:${ANDROID_SOURCE}/bin
| + | |
− | </pre>
| + | |
− | ==Construction of Android environment==
| + | |
− | ===Download Android source===
| + | |
− | The [http://source.android.com/download getting Android source] document describes how to set up our local work environment.
| + | |
− | Follow theses instructions until '''Installing Repo''' chapter.<br>
| + | |
− | <pre class="host">
| + | |
− | $ mkdir ANDROID_SOURCE
| + | |
− | $ cd $ANDROID_SOURCE
| + | |
− | $ mkdir bin
| + | |
− | $ curl http://android.git.kernel.org/repo >$ANDROID_SOURCE/bin/repo
| + | |
− | $ chmod a+x $ANDROID_SOURCE/bin/repo
| + | |
− | $ repo init -u git://android.git.kernel.org/platform/manifest.git -b android-sdk-1.5_r3
| + | |
− | $ repo sync
| + | |
− | </pre>
| + | |
− | Since android-sdk-1.5_r3 branch, the Linux kernel isn't with the Android source,
| + | |
− | We can download it in a compress archive (tar.gz) file with this [http://android.git.kernel.org/?p=kernel/common.git;a=snapshot;h=refs/heads/android-2.6.29;sf=tgz android-kernel-2.6.29] (about (70Mib) or with git repository (more 300Mib)
| + | |
− | <pre class="host">
| + | |
− | $ mkdir $ANDROID_SOURCE/kernel
| + | |
− | $ cd $ANDROID_SOURCE/kernel
| + | |
− | $ git clone git://android.git.kernel.org/kernel/common.git android-2.6.29
| + | |
− | </pre>
| + | |
− | | + | |
− | ===Apply the Armadeus patchset===
| + | |
− | Before compiling the kernel, we patch the source with the Armadeus patches. In second time, I will give the URL to retrieve Linux 2.6.29.4 patch.
| + | |
− | <pre class="host">
| + | |
− | $ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/downloads patch-2.6.29.4.bz2
| + | |
− | $ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/toolchain/kernel-headers linux-2.6.29.4-\*.patch{,.gz,.bz2}
| + | |
− | $ $ARMADEUS/buildroot/toolchain/patch-kernel.sh $ANDROID_SOURCE/kernel $ARMADEUS/buildroot/target/device/armadeus/linux/kernel-patches/2.6.29.4 \*.patch{,.gz,.bz2}
| + | |
− | $ mkdir $ANDROID_SOURCE/kernel/drivers/armadeus
| + | |
− | $ cp -r $ARMADEUS/target/linux/modules/* $ANDROID_SOURCE/kernel/drivers/armadeus
| + | |
− | $ cp $ARMADEUS/target/device/armadeus/apf27/apf27-linux-2.6.29.config $ANDROID_SOURCE/kernel/arch/arm/configs/apf27_android_defconfig
| + | |
− | </pre>
| + | |
− | ===Battery patch===
| + | |
− | At the beginning, reboot happened over again even though Android logo appeared on board.
| + | |
− | Result of investigation, we found that battery power was returned with 0 when boot..
| + | |
− | To complete!!!
| + | |
− | ===Android kernel configuration (2.6.29)===
| + | |
− | Make sure your kernel boots normally on your board. Then enable some Android specific configuration and make sure that your kernel still boots (with your standard file system).
| + | |
− | * EABI
| + | |
− | <pre class="config">
| + | |
− | CONFIG_AEABI=y
| + | |
− | # CONFIG_OABI_COMPAT is not set
| + | |
− | </pre>
| + | |
− | * THUMB
| + | |
− | <pre class="config">
| + | |
− | CONFIG_ARM_THUMB=y
| + | |
− | </pre>
| + | |
− | * Android drivers
| + | |
− | <pre class="config">
| + | |
− | | + | |
− | # Android
| + | |
− | #
| + | |
− | CONFIG_ANDROID=y
| + | |
− | CONFIG_ANDROID_BINDER_IPC=y
| + | |
− | CONFIG_ANDROID_LOGGER=y
| + | |
− | # CONFIG_ANDROID_RAM_CONSOLE is not set
| + | |
− | CONFIG_ANDROID_TIMED_OUTPUT=y
| + | |
− | CONFIG_ANDROID_LOW_MEMORY_KILLER=y
| + | |
− | </pre>
| + | |
− | | + | |
− | ===compile Android kernel===
| + | |
− | <pre class="host">
| + | |
− | $ cd $ANDROID_SOURCE/kernel
| + | |
− | $ make ARCH=arm mrproper
| + | |
− | $ make ARCH=arm apf27_android_defconfig
| + | |
− | $ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi- uImage
| + | |
− | $ cp ./arch/arm/boot/uImage $TFTPBOOT/apf27-linux.bin
| + | |
− | </pre>
| + | |
− | ==Making SD card for boot==
| + | |
− | ===Copying the Android root filesystem===
| + | |
− | Android’s root file system is generated in $ANDROID_SOURCE/out/target/product/generic
| + | |
− | <pre class="host">
| + | |
− | $ cd $ANDROID_SOURCE/out/target/product/generic
| + | |
− | $ mkdir $ANDROID_SOURCE/rootfs (or '$ sudo rm -rf $ANDROID_SOURCE/rootfs/*' if the folder already exist )
| + | |
− | $ cp -a root/* $ANDROID_SOURCE/rootfs/
| + | |
− | $ cp -a system/* $ANDROID_SOURCE/rootfs/system/
| + | |
− | $ cd $ANDROID_SOURCE/rootfs
| + | |
− | $ sudo chown -R root.root .
| + | |
− | $ sudo chmod -R a+rwX data system
| + | |
− | </pre>
| + | |
− | ===Change init.rc===
| + | |
− | Open $ANDROID_SOURCE/system/core/rootdir and comment the 'mount yaffs2' lines like this:
| + | |
− | <pre class="config">
| + | |
− | ...
| + | |
− | # mount mtd partitions
| + | |
− | # Mount /system rw first to give the filesystem a chance to save a checkpoint
| + | |
− | # mount yaffs2 mtd@system /system
| + | |
− | # mount yaffs2 mtd@system /system ro remount
| + | |
− | | + | |
− | # We chown/chmod /data again so because mount is run as root + defaults
| + | |
− | # mount yaffs2 mtd@userdata /data nosuid nodev
| + | |
− | chown system system /data
| + | |
− | chmod 0771 /data
| + | |
− | | + | |
− | # Same reason as /data above
| + | |
− | # mount yaffs2 mtd@cache /cache nosuid nodev
| + | |
− | chown system cache /cache
| + | |
− | chmod 0770 /cache
| + | |
− | | + | |
− | # This may have been created by the recovery system with odd permissions
| + | |
− | chown system system /cache/recovery
| + | |
− | chmod 0770 /cache/recovery
| + | |
− | ...
| + | |
− | </pre>
| + | |
− | ===Formatting an MMC/SD card===
| + | |
− | We will create two partitions on our mmc/µSD card, The first one will use for Android memory card, the second one will use for Android file system.
| + | |
− | First connect your card reader to your workstation, with the mmc/µSD card inside. Type the '''dmesg''' command to see which device is used by your workstation. Let’s assume that this device is '''/dev/sdb'''
| + | |
− | <pre class="host">
| + | |
− | $ dmesg
| + | |
− | ...
| + | |
− | [ 9145.613954] sdb: sdb1 sdb2
| + | |
− | [ 9145.615125] sd 10:0:0:0: [sdc] Attached SCSI removable disk
| + | |
− | [ 9145.615258] sd 10:0:0:0: Attached scsi generic sg3 type 0
| + | |
− | </pre>
| + | |
− | Type the mount command to check your currently mounted partitions. If MMC/SD partitions are mounted, unmount them.<br>
| + | |
− | In a terminal edit partitions with fdisk:
| + | |
− | <pre class="host">
| + | |
− | sudo fdisk /dev/sdb
| + | |
− | </pre>
| + | |
− | Delete any existing partition with the d command.<br>
| + | |
− | Now, create the boot partition:
| + | |
− | <pre class="host">
| + | |
− | Command (m for help): n
| + | |
− | Command action
| + | |
− | e extended
| + | |
− | p primary partition (1-4)
| + | |
− | p
| + | |
− | Partition number (1-4): 1
| + | |
− | First cylinder (1-495, default 1): 1
| + | |
− | Last cylinder, +cylinders or +size{K,M,G} (1-239, default 239): +1G
| + | |
− | </pre>
| + | |
− | Change its type to FAT32:
| + | |
− | <pre class="host">
| + | |
− | Command (m for help): t
| + | |
− | Selected partition 1
| + | |
− | Hex code (type L to list codes): c
| + | |
− | Changed system type of partition 1 to c (W95 FAT32 (LBA))
| + | |
− | </pre>
| + | |
− | Using the n command again, create a second partition filling up the rest of your card (just accept default values).<br>
| + | |
− | Now, format the partitions in your card:
| + | |
− | <pre class="host">
| + | |
− | sudo mkfs.vfat -n MemoryCard -F 32 /dev/sdb1
| + | |
− | sudo mkfs.ext2 -L AndroidFS /dev/sdb2
| + | |
− | </pre>
| + | |
− | Remove and insert your card again. Your new partitions should be mounted automatically.<br>
| + | |
− | ===Copying data to the MMC/SD card===
| + | |
− | Now copy the Android root filesystem to the second partition.
| + | |
− | <pre class="host">
| + | |
− | sudo rsync -a $ANDROID_SOURCE/rootfs/ /media/AndroidFS/
| + | |
− | </pre>
| + | |
− | Finish by unmounting your mmc/µSD partitions:
| + | |
− | <pre class="host">
| + | |
− | sudo umount /media/MemoryCard
| + | |
− | sudo umount /media/AndroidFS
| + | |
− | </pre>
| + | |
− | ==Boot setup==
| + | |
− | The last thing left to do is to specify how the board boots Linux.<br>
| + | |
− | In the U-boot prompt, make the mmc boot is on second partition of the mmc/µSD card
| + | |
− | <pre class="apf">
| + | |
− | # setenv mmcroot '/dev/mmcblk0p2 rw'
| + | |
− | </pre>
| + | |
− | Now set the kernel command line arguments
| + | |
− | <pre class="apf">
| + | |
− | # setenv addmmcargs 'setenv bootargs ${bootargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=\init androidboot.console=ttyS0'
| + | |
− | # saveenvmtd-utils
| + | |
− | </pre>
| + | |
− | ==Debug==
| + | |
− | <pre class="apf">
| + | |
− | # mount /dev/mmcblk0p2 /mnt/mmc
| + | |
− | # strace -f -ff -tt -s 200 chroot /mnt/mmc /init androidboot.console=ttyS0
| + | |
− | # strace chroot /mnt/mmc /init androidboot.console=ttyS0
| + | |
− | </pre>
| + | |
− | ===Test with Android emulator===
| + | |
− | [http://developer.android.com/guide/developing/tools/emulator.html emulator]
| + | |
− | <pre class="host">
| + | |
− | $ make ARCH=arm goldfish_defconfig
| + | |
− | $ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi
| + | |
− | # créer des AVD (Android Virtual Device)
| + | |
− | $ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-H -t 2 -s 272x480
| + | |
− | $ ~/dev/android-sdk-linux_x86-1.5_r3/tools/android create avd -n APF27-L -t 2 -s 480x272
| + | |
− | $ $ANDROID/out/host/linux-x86/bin/emulator -avd APF27-H -sysdir $ANDROID/out/target/product/generic/ -kernel $ANDROID/kernel/arch/arm/boot/zImage -data $ANDROID/out/target/product/generic/userdata.img -ramdisk $ANDROID/out/target/product/generic/ramdisk.img -system $ANDROID/out/target/product/generic/system.img
| + | |
− | </pre>
| + | |
− | | + | |
− | ==Android Root File system==
| + | |
− | Android emulator has 3 basic images on tools/lib/images directory.
| + | |
− | * '''ramdisk.img''' is gziped cpio archive. ramdisk.img is a small partition image that is mounted read-only by the kernel at boot time. It only contains /init and a few config files. It is used to start init which will mount the rest of the system images properly and run the init procedure. A Ramdisk is a standard Linux feature. It is made just for the Android and do special things to start up the Android system.
| + | |
− | * '''system.img''' is a partition image that will be mounted as / and thus contains all system binaries.
| + | |
− | * '''userdata.img''' is a partition image that can be mounted as /data and thus contains all application-specific and user-specific data.
| + | |
− | '''/system''' directory has libraries and default system packages (*.apk). /data directory has timezone, cache, and ''ApiDemos.apk'' package.<br>
| + | |
− | The main services are zygote('''/system/bin/app_process'''), runtime('''/system/bin/runtime'''), and dbus('''/system/bin/dbus-daemon'''). You can see the '''/etc/init.rc''' file on the Android ramdisk image.
| + | |
− | <pre class="apf">
| + | |
− | ...
| + | |
− | zygote {
| + | |
− | exec /system/bin/app_process
| + | |
− | args {
| + | |
− | 0 -Xzygote
| + | |
− | 1 /system/bin
| + | |
− | 2 --zygote
| + | |
− | }
| + | |
− | autostart 1
| + | |
− | }
| + | |
− | runtime {
| + | |
− | exec /system/bin/runtime
| + | |
− | autostart 1
| + | |
− | }
| + | |
− | ...
| + | |
− | dbus {
| + | |
− | exec /system/bin/dbus-daemon
| + | |
− | args.0 --system
| + | |
− | args.1 --nofork
| + | |
− | autostart 1
| + | |
− | }
| + | |
− | ...
| + | |
− | </pre>
| + | |
Je suis Nicolas Duclos, j'ai 35 ans et je suis informaticien de formation avec un DESS (master) en info à Rennes.