Home

  • Unlocking Motorola RAZR i (XT890) bootloader

    Get Device ID

    C:homekimisdkandroidplatform-tools>fastboot.exe oem get_unlock_data
    < waiting for device >

    (bootloader) 3A35120005260968#53304237373054
    (bootloader) 5A493200000000000000000000#200E
    (bootloader) AAD3AF9C168CA7185FAB94159B0E543
    (bootloader) D836A#6D81236CC0D64A84AFC35817B
    (bootloader) CD123456
    OKAY [ 0.328s]
    finished. total time: 0.332s
    1) Device ID = Concat the 5 string
    3A35120005260968#543032333730525A493200000000000000000000#100EAAD3AB9F778CA7185CDB94159B0E543D836A#6D85976CC0D64A84AFC35817BCD50000
    2) Check Device can be unlockeable
    3) Request Unlock Key (Bye bye Warranty)
    4) Get Unlock Code from email

    Unlock Device

    1) fastbook devices
    C:homekimisdkandroidplatform-tools>fastboot.exe devices
    T02370RZI2 fastboot
    2) send unlock code to phone
    C:homekimisdkandroidplatform-tools>fastboot.exe oem unlock XXXXXXXXXXXXXX

    (bootloader) Creating EXT4 FileSystem for userdata
    (bootloader) Unlock completed! please reboot
    OKAY [ 19.262s]
    finished. total time: 19.267s
    C:homekimisdkandroidplatform-tools>
    3) Reboot (cycle power)
    4) An alert will appear… -> Device unlocked!
     
    Ref. URL: https://motorola-global-portal.custhelp.com/app/standalone/bootloader/unlock-your-device-b
     

  • Loading rootfs from USB in Beagleboard

    1) Format a USB Flash Drive with EXT4 File System
    2) Decompress rootfs.tar.gz into USB Flash Drive
    cp rootfs.tar.gz /media/USBDrive
    cd /media/USBDrive
    tar -jxvf rootfs.tar.gz
    rm rootfs.tar.gz
    3) Now we will tell the board to boot from USB

    cp ~/RowboatTools/am37x/mk-bootscr/mkbootscr ~/RowboatTools/am37x/mk-bootscr/mkbootscrUSB

    vi  ~/RowboatTools/am37x/mk-bootscr/mkbootscrUSB

    change root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait to root=/dev/sda1 rw rootfstype=ext4 rootdelay=30 rootwait
    4) Build boot.scr
    cd ~/RowboatTools/am37x/mk-bootscr/
    ./mkbootscrUSB

    5) Copy boot.scr into SD Card – Boot partition
    cp boot.scr /media/boot
    6) Unmount all drives and boot with SD Card and USB Flash Drive inserted
    Later you can try formating the “rootfs” partition in the SD Card and restart the board. Don’t erase the partition, just the content.
    You will find that running Android on Beagleboard from USB may be, by far, faster than from SD Card.

  • Setup Development Tools for Android

    Software needed

    • Eclipse IDE for Java Developers (at least Eclipse 4.2  – Juno) – link
    • Android ADT Plugin
    • Android SDK
    • Android NDK

    Eclipse and ADT

    1. Decompress Eclipse inside your user folder
    2. Start Eclipse with a default workplace
    3. Click on Help -> Install New Software
    4. Click on Add
    5. Enter ADT Plugin as the Repository Name
    6. In Location enter https://dl-ssl.google.com/android/eclipse/ 
    7. Click Ok
    8. Select Developer Tools and NDK Plugins
    9. Click Next and follow the installation instructions.
    Proceed restarting the Eclipse if you are prompt to do so.

    Installing ADT

    When starting Eclipse again, you will see a dialog with a Welcome message. If you don’t have the latest Android SDK, install it.

    Once you have installed and set up the IDE, you are ready to start developing Android apps. It’s recommended to install more SDKs from the Android SDK Manager. For Example, Android 4.1 (the latest version is 4.2) and Android 2.3.

  • Android Jelly Bean (4.1.2) for Beagleboard xM in Photos

    Beagleboard hardware

    Android information

    Available memory on Beagleboard with Jelly Bean 4.1.2

    Browsing the Internet

  • Building Android Jelly Bean (4.1.2) for Beagleboard xM

    Jelly Bean on Beagleboard xM

    Prerequisites

    • Ubuntu 12.04 LTS – AMD64
      • A 64-bit OS is needed in order to build Android 4.x from source code
    • Dual- or Quad-core  (recommended) CPU
    • At least 4GB of RAM
    • 45GB of free disk space
    • Internet connection

    Installing utils and libs

    From a Terminal console execute
    sudo aptitude install ia32-libs
    sudo apt-get install git-core gnupg flex bison gperf build-essential
    zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev
    libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386
    libgl1-mesa-dev g++-multilib mingw32 openjdk-6-jdk tofrodos
    python-markdown libxml2-utils xsltproc zlib1g-dev:i386

    and then
    sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

    Installing Oracle Java JDK

    1. Download Oracle Java6 JDK from here (file: jdk-6u34-linux-x86.bin) to ~/Downloads
    2. In a Terminal cnosole execute
      1. cd ~/Downloads
      2. cp jdk-6u43-linux-x64.bin ~/
      3. cd ~/
      4. chmod +x  jdk-6u43-linux-x64.bin
      5. ./jdk-6u43-linux-x64.bin
      6. sudo mv jdk1.6.0_43/ /usr/lib/jvm/
    3. Add Oracle Java6 JDK to Ubuntu JVM list
      1. sudo update-alternatives –install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.0_43/bin/javac 1
      2. sudo update-alternatives –install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_43/bin/java 1
      3. sudo update-alternatives –install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.6.0_43/bin/javaws 1
    4. Select Oracle Java6 JDK as default JVM
      1. sudo update-alternatives –config javac
      2. sudo update-alternatives –config java
      3. sudo update-alternatives –config javaws

    In this three last commands, select Oracle Java6 JDK as default, like in the example below

    kimi@X-Server:~$ sudo update-alternatives --config java
    There are 2 choices for the alternative java (providing /usr/bin/java).

    Selection Path Priority Status
    ————————————————————
    0 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 auto mode
    1 /usr/lib/jvm/java-6-openjdk-amd64/jre/bin/java 1061 manual mode
    * 2 /usr/lib/jvm/jdk1.6.0_34/bin/java 1 manual mode
    Press enter to keep the current choice[*], or type selection number: 2

    Installing REPO

    Repo is a tool created by Google in order to admin git repositories easyly.
    In a Terminal console execute

    1. mkdir ~/bin
    2. export PATH=~/bin:$PATH
    3. curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
    4. chmod a+x ~/bin/repo

    Initialize the repository

    1. mkdir ~/rowboat-android
    2. cd ~/rowboat-android
    3. repo init -u git://gitorious.org/rowboat/manifest.git -m rowboat-jb-am37x.xml                         (JB for Beagleboard)
    4. repo sync

    If a warning telling you that there is a new REPO version appears. Stop the sync process and update

    1.  cp ~/rowboat-android/.repo/repo/repo  ~/bin/repo
    2. chmod a+x ~/bin/repo
    3. repo sync

    Once the repo is successfully synced, you will see a message like this:

    * [new branch]      rowboat-froyo -> rowboat/rowboat-froyo
    * [new branch]      rowboat-gingerbread -> rowboat/rowboat-gingerbread
    * [new branch]      rowboat-ics -> rowboat/rowboat-ics
    * [new branch]      rowboat-jb -> rowboat/rowboat-jb
    * [new branch]      ti-dsp     -> rowboat/ti-dsp
    Fetching projects: 100% (261/261), done.
    Checking out files: 100% (8843/8843), done.out files:  10% (949/8843)
    Checking out files: 100% (24601/24601), done.ut files:  50% (12308/24601)
    Checking out files: 100% (18021/18021), done.ut files:   3% (616/18021)
    Checking out files: 100% (35638/35638), done.ut files:   1% (663/35638)
    Checking out files: 100% (2088/2088), done. out files:   6% (134/2088)
    Checking out files: 100% (974/974), done.ng out files:  34% (336/974)
    Checking out files: 100% (667/667), done.ng out files:  18% (123/667)
    Checking out files: 100% (2412/2412), done. out files:   4% (106/2412)
    Checking out files: 100% (26958/26958), done.ut files:  24% (6516/26958)
    Checking out files: 100% (81/81), done.
    Checking out files: 100% (441/441), done.ng out files:  43% (194/441)
    Checking out files: 100% (6505/6505), done. out files:   1% (108/6505)
    Syncing work tree: 100% (261/261), done.

    kimi@X-Server:~/rowboat-android$

    Cross compiling Jelly Bean for Beagleboard

    Now we are going to modify the PATH variable in order to include the binary directory of the GCC compiler. The following command should be executed every time you open a new Terminal console and want to compile the code. Unless, you include the new PATH into your ‘.bashrc’ or ‘.bash_profile’ file.
    export PATH=~/rowboat-android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH

    X-loader

    X-loader is a small first stage boot loader derived from the u-boot base code to be loaded into the internal static ram by the OMAP ROM code. Because the internal static ram is very small (64k-32k), x-loader is stripped down to the essentials and is used to initialize memory and enough of the peripheral devices to access and load the second stage loader (U-boot) into main memory.
    In order to build X-loader we will follow these steps
    cd ~/rowboat-android/x-loader/
    make CROSS_COMPILE=arm-eabi- distclean
    make CROSS_COMPILE=arm-eabi- omap3beagle_config
    make CROSS_COMPILE=arm-eabi- -j4

    the parameter ‘-j4’ will tell the make to use up to 4 threads to build the code. If you have a dual-core/two-threads CPU, use ‘-j2’. Omitting this parameter will also compile the code, but using just a single thread (which for x-loader or u-boot is not a big problem, but the Android source code can take many hours).
    The result of this process is a file named ‘x-load.bin’ on the current directory. This file should be signed with a tool called ‘signGP’ before x-loader gets into the MMC card.

    Downloading Rowboat-tools for Jelly Bean

    cd ~
    curl http://rowboat.googlecode.com/files/RowboatTools.tar.gz > RowboatTools.tar.gz
    tar -zxvf RowboatTools.tar.gz

    Signing x-load.bin

    cp ~/RowboatTools/signGP/signGP ~/rowboat-android/x-loader/signGP
    cd ~/rowboat-android/x-loader
    ./signGP x-load.bin
    cp x-load.bin.ift MLO

    Now we have a ‘MLO’ file which is a signed version of the binary x-loader, and this file can be used in the board.

    Uboot

    Uboot is a universal bootloader program that developed for the loading and starting of embedded Linux systems. Uboot essentially can load a (linux) kernel from one of several locations, and start it with corresponding arguments.

    cd ~/rowboat-android/u-boot/
    make CROSS_COMPILE=arm-eabi- distclean
    make CROSS_COMPILE=arm-eabi- omap3_beagle_config
    make CROSS_COMPILE=arm-eabi- -j4

    The result of this process is ‘u-boot.bin’ file. And a successful build generates an output like this:

    api/libapi.a post/libpost.a board/ti/beagle/libbeagle.a --end-group /home/kimi/rowboat-android/u-boot/arch/arm/lib/eabi_compat.o -L /home/kimi/rowboat-android/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google -lgcc -Map u-boot.map -o u-boot
    arm-eabi-objcopy -O srec u-boot u-boot.srec
    arm-eabi-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
    kimi@X-Server:~/rowboat-android/u-boot$

    Building Android, Kernel and SGX

    In order to build Android, its kernel and SGX (which provides the Hardware Acceleration needed by Android 3.x+)

    cd ~/rowboat-android
    make TARGET_PRODUCT=beagleboard OMAPES=5.x -j4

    (This step takes aprox. 1 hour)
    If this commad successed you will see something like this on the console

    Installation complete!

    cat install.sh >install
    chmod a+x install
    make[1]: Leaving directory `/home/kimi/rowboat-android/hardware/ti/sgx’
    If you don’t see an output like this, try running the command without “-j4”.
    If everything is Ok, then it’s time to create the root filesystem and compress it into a tar.gz file. (20 minutes. aprox)
    cd ~/rowboat-android
    make TARGET_PRODUCT=beagleboard fs_tarball -j4

    Building Kernel and Android separately

    It is possible to build the kernel and Android separately, and this is recommended once you have done a full build and you have modified only a small part of the code.

    Builing the Kernel

    cd ~/rowboat-android/kernel
    make ARCH=arm CROSS_COMPILE=arm-eabi- distclean
    make ARCH=arm CROSS_COMPILE=arm-eabi- omap3_beagle_android_defconfig
    make ARCH=arm CROSS_COMPILE=arm-eabi- uImage -j4

    This will generate ‘uImage’ (kernel image) in “~/rowboat-android/kernel/arch/arm/boot”

    Builing Android

    cd ~/rowboat-android
    make TARGET_PRODUCT=beagleboard droid -j4

    Again, in order to create the root filesystem, run

    cd ~/rowboat-android
    make TARGET_PRODUCT=beagleboard fs_tarball

    Creating a bootable SD-Card

    Once x-load, Uboot, kernel and Android are built, it’s time to create a bootable SD-Card with all this files.

    Boot arguments

    Edit boot arguments for am37x.
    cd ~/RowboatTools/am37x/mk-bootscr
    gedit boot.scr

    Change mem=256M with mem=448M. This will increase the amount of RAM available in Android for applications.
    Generate boot script
    ./mkbootscr

    Putting all together

    Format the SD Card into a single FAT32 partition. A +4GB SD Card is recommended, while the minimum amount of memory is 2GB.

    mkdir ~/rowboat-image
    cp ~/rowboat-android/kernel/arch/arm/boot/uImage ~/rowboat-image
    cp ~/rowboat-android/u-boot/u-boot.bin ~/rowboat-image
    cp ~/rowboat-android/x-loader/MLO ~/rowboat-image
    cp ~/RowboatTools/am37x/mk-bootscr/boot.scr ~/rowboat-image
    cp ~/rowboat-android/out/target/product/beagleboard/rootfs.tar.bz2 ~/rowboat-image
    cp ~/RowboatTools/am37x/mk-mmc/mkmmc-android.sh ~/rowboat-image

    Execute the script

    cd ~/rowboat-image
    sudo ./mkmmc-android.sh /dev/sdb  MLO u-boot.bin uImage boot.scr rootfs.tar.bz2

    Change /dev/sdb with the path for your SD Card
    If you don’t see anything executed on the console, may be mkmmc-android.sh has a hidden char that generates problem. Try opening the file with gEdit and copying the content to another file, for example mkmmc.sh. Then make that file executable and try again.

    Ready!

    Now you are ready to extract the SD Card, insert it into the Beagleboard and run Android. Be patience, the first start up can take several minutes. The second time you start up Android it takes minutes more or less.

    Performance

    Some SD Cards show a very poor performance. Most Kingston micro SDHC cards have this performance issue. San Disk micro SDHC or Sony micro SDHC are recommended.

    Known issues

    • mmc0: error -110 whilst initializing SD card
    Your are using a SDHC Card affected by preemption model in Kernel 2.6. Look to this post about loading “rootfs” from USB . This avoids the bug, and gives more performance & storage space.
  • Simple log for iOS

    In every method two very important variables can be found. One is already known by many iOS dev, and it is ‘self’. The other one is ‘_cmd’. This last one is the selector of the current method. This variable can useful for logging purposes. In the Silver Sparrow log framework, it is used inside a macro in order to add important information to a log entry.
    For example:
    NSLog(@"{ERROR} [%@ %@] %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), message);
    In this line, the class name and the method name are added to NSLog.
    You can download and use the log library, which is available at SSLoger on GitHub

  • Passcode Lock Screen for iOS

    I have designed a small library (with its test project) that lets you implement a passcode lock screen on iOS. The library is compatible with iPod Touch, iPhone and iPad. And it is very easy to use.
    EAPasscodeLock* passcodeManager = [[EAPasscodeLock alloc] init];
    UIViewController* plViewController = [passcodeManager passcodeViewControllerWithCode:@"1234" cancellable:YES hintText:nil maxRetries:4 delegate:self];
    [self presentModalViewController:plViewController animated:NO];

    There is a protocol you should implement, with only one obligatory method, that sends messages to the main view.
    @protocol EAPasscodeLockProtocol
    @required
    // Called when the passcode is entered correctly after dismissing the passcode View Controller
    -(void)passcodeDidUnlockedSuccessfully;
    @optional
    // Called when the passcode is entered correctly before dismissing the passcode View Controller
    -(void)passcodeWillUnlockedSuccessfully;
    // Called when a passcode entered is incorrect
    -(void)passcodeFailedToUnlock;
    // Called when the cancel button was pressed and after the passcode View Controller is dismissed
    -(void)passcodeLockWillBeCancelled;
    // Called when the passcode was entered incorrectly too many times
    -(void)passcodeFailedWithTooManyAttempts;
    @end
    Here a few screenshots of the iPad UI

    Empty passcode screen

    Typing the code

    Wrong passcode message

    Find the lastest version on GitHub: https://github.com/eaceto/EAPasscodeLock

  • SVN Tip

    //search and delete .svn
    find . -depth -name .svn -exec rm -fr {} ;

  • I want to boot my Kernel on a real machine

    Testing and running the Kernel with QEMU is nice, it is faster for developing but it is not what we want. We want to run things in real hardware.

    #mtools
    echo "drive c: file="`pwd`/bootable.img" partition=1" > ~/.mtoolsrc

    #create an image
    dd if=/dev/zero of=bootable.img count=088704 bs=512
    mpartition -I c:
    mpartition -c -t 88 -h 16 -s 63 c:
    mformat c:
    mmd c:/boot
    mmd c:/boot/grub

    #copy grub bootloader
    mcopy grub/grub-0.94-i386-pc/boot/grub/stage1 c:/boot/grub
    mcopy grub/grub-0.94-i386-pc/boot/grub/stage2 c:/boot/grub
    mcopy grub/grub-0.94-i386-pc/boot/grub/fat_stage1_5 c:/boot/grub

    #grub
    echo "(hd0) bootable.img" > bmap
    printf "geometry (hd0) 88 16 63 n root (hd0,0) n setup (hd0)n" | /usr/sbin/grub --device-map=bmap --batch

    #copy menu.lst to bootable.img
    mcopy menu.lst c:/boot/grub/


     
     
     
     
    mcopy kernel.bin c:/boot/grub/
    We can test this image using qemu like this
    qemu -hda bootable.img
    Then, the image can be burned into a pendrive using ‘dd’ or ‘usb-imagewriter’

    1. sudo apt-get install usb-imagewriter (in order to install the GUI Tool)
    2. sudo dd if=bootable.img of=/dev/sdX (where sdX is the pendrive location into /dev)
  • Monolithic or Micro Kernels

    Small differences

    The Kernel is that tiny but very important part of the Operating System that acts as bridge between the applications and the low level resources of the computer.When your computer boots, after the boot loader is executed, the Kernel is called. I/O operations and Memory are the most important abstractions of the Kernel, and if the Kernel can run in several processors, it is also important the CPU abstraction.
    There are two types of Kernels those called “monolithic kernels” and “microkernels”. The first one embedded all the OS services inside the Kernel. May be this is the easier Kernel to implement, but if there is a bug in some part of the code, it will probably crash the Kernel. Microkernels takes a different approach. Why implementing a monolithic Kernel is not a bad idea? Because this type of kernels are faster, they may have less bugs, and the compiled version may be smaller. And this is the approach used in traditional Unix-like systems. So, it’s not a bad idea.
    Microkernels implements minimal OS services, like memory management, multitasking or process communications, but leaves other services like networking outside the kernel, and those services should be implemented in the user space area. This kind of kernels are easier to maintain, and you can load and unload a module without restarting the kernel. But generally the kernel occupies a lot of memory, and bugs are harder to fix.

    The Kernel as an abstraction layer between hardware and software