안드로이드 커널 빌드 (LG-F260S)/Optimus LTE3

■ 커널 소스코드 다운로드

http://opensource.lge.com/osSch/list?types=ALL&search=f260
LGF260S_LTE3_Kitkat_V20d를 다운로드 받는다.


■ 툴체인 다운로드

git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7


■ 오리지널 boot.img 가져오기

root 권한으로 adb shell에서 root 권한으로 아래를 실행하여 원본 boot.img를 sdcard에 넣는다.
su
dd if=/dev/block/platform/msm_sdcc.1/by-name/boot of=/storage/sdcard0/boot.img.orig bs=4096


■ aboot.img 가져오기

패키징에 필요한 aboot.img를 가져온다.
dd if=/dev/block/platform/msm_sdcc.1/by-name/aboot of=/storage/sdcard0/aboot.img


■ 오리지널 boot.img 분해 및 정보보기

../boot.img.orig/unpackbootimg -i ../boot.img.orig/boot.img.orig
BOARD_KERNEL_CMDLINE console=ttyHSL0,115200,n8 androidboot.hardware=fx1sk user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 maxcpus=2 lpj=67741
BOARD_KERNEL_BASE 80200000
BOARD_PAGE_SIZE 2048

※ BOARD_KERNEL_CMDLINE을 정확히 보기 위해서는 폰에서 /proc/cmdline을 cat 하면 된다.


■ 커널 CONFIG 복사

내 설정을 저장하기 위해 복사본으로 작업한다.
cp arch/arm/configs/fx1sk-perf_defconfig arch/arm/configs/hasu0707_defconfig


■ 커널 OTG 패치

커널 루트에서 아래를 실행한다.
patch -p1 < ../scripts/_msm_otg__add_usb_unbind_and_rebind_drivers.patch


■ 커널에 OTG 및 USB시리얼 드라이버 추가

arch/arm/configs/hasu0707_defconfig 파일에서 아래를 적당한 위치에 추가.

# by hasu0707
CONFIG_USB_SUSPEND=y
CONFIG_USB_OTG=y
CONFIG_USB_OTG_WHITELIST=y
CONFIG_USB_GADGET=y
CONFIG_USB_MSM_OTG=y
CONFIG_USB_OTG_UTILS=y
CONFIG_USB_SERIAL_CP210X=y
CONFIG_USB_SERIAL_FTDI_SIO=y


■ 커널 빌드

../scripts/clean.sh
../scripts/build.sh


■ boot.img 만들기

../scripts/mkbootimg --kernel zImage --ramdisk ../boot.img.orig/orig_boot_20f.img-ramdisk.gz --base 0x80200000 --pagesize 2048 --cmdline 'ttyHSL0,115200,n8 androidboot.hardware=fx1sk user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 maxcpus=2 lpj=67741 uart_console=disable lge.rev=rev_10 lcd_maker_id=primary gpt=enable lge.batt_info=isl6296_l lge_handle_panic.hreset_enable=1 lge.boo androidboot.emmc=true androidboot.serialno=000000 lge.signed_image=true androidboot.baseband=msm' -o new_boot.img


■ 커널 적용

커널 적용은 loki_tool을 사용하여 적용한다. (https://github.com/djrbliss/loki/tree/master/bin)
loki_tool은 부트로더 잠금을 우회하여 boot.img를 lok로 바꿔 폰에 심어준다.
새로운 커널이 /storage/sdcard0/new_boot.img 이고 /system/bin/loki_tool 이 설치되어 있다고 가정.

cd /data/local/tmp
dd if=/dev/block/platform/msm_sdcc.1/by-name/aboot of=aboot.img

# new_boot.img를 패치
loki_tool patch boot aboot.img /storage/sdcard0/new_boot.img out.lok

# new_boot.img를 설치
loki_tool flash boot out.lok


■ 결과

실패.ㅠㅠ


■ scripts/build.sh

#!/bin/sh
###########################################################
#
# build.sh : kernel/ 밑에서 작업 할 것.
#
###########################################################
export ARCH=arm
export CROSS_COMPILE=arm-eabi-
export KERNEL_BUILD_ID=hasu0707
export TOOLCHAIN=/opt/kernel_lg_f260s_v20d_kitkat/arm-eabi-4.7
export PATH=${TOOLCHAIN}/bin:${PATH}

###########################################################
#
# 나만의 커널 설정을 만들어 놓고 그것을 사용해 빌드한다.
#
###########################################################
cp -f ../configs/${KERNEL_BUILD_ID}_defconfig ./arch/arm/configs/
mkdir -p ./${KERNEL_BUILD_ID}/kernel
mkdir -p ./${KERNEL_BUILD_ID}/ko
make ARCH=arm V=0 O=./${KERNEL_BUILD_ID}/kernel/ CROSS_COMPILE=${TOOLCHAIN}/bin/arm-eabi- ${KERNEL_BUILD_ID}_defconfig zImage
make -j8 ARCH=arm O=./${KERNEL_BUILD_ID}/kernel/ 2>&1 | tee ${KERNEL_BUILD_ID}_kernel.log

###########################################################
#
# zImage가 생성되어 있으면 빌드가 정상적으로 된 것이므로
# mkbootimg를 사용해 new_boot.img를 만든다.
# mkbootimg 파라메터는 기종마다 다르다.
#
###########################################################
if [ -f ./${KERNEL_BUILD_ID}/kernel/arch/arm/boot/zImage ]
then
    cp -f ./${KERNEL_BUILD_ID}/kernel/arch/arm/boot/zImage ./
    find ./${KERNEL_BUILD_ID} -name "*.ko" -print -exec cp -f {} ./${KERNEL_BUILD_ID}/ko/ \;
    ../scripts/mkbootimg --kernel zImage --ramdisk ../boot.img.orig/orig_boot_20f.img-ramdisk.gz --base 0x80200000 --pagesize 2048 --cmdline 'ttyHSL0,115200,n8 androidboot.hardware=fx1sk user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 maxcpus=2 lpj=67741 uart_console=disable lge.rev=rev_10 lcd_maker_id=primary gpt=enable lge.batt_info=isl6296_l lge_handle_panic.hreset_enable=1 lge.boo androidboot.emmc=true androidboot.serialno=000000 lge.signed_image=true androidboot.baseband=msm' -o new_boot.img
fi

###########################################################
#
# loki_tool 작업
#
###########################################################
if [ -f ./new_boot.img ]
then
    ../loki_tool/loki_tool.x86_64 patch boot ../boot.img.orig/aboot_pillz-recovery.img ./new_boot.img ./new_boot.lok
    echo "### COMPLETE !! ###"
fi

■ scripts/clean.sh

#!/bin/sh
###########################################################
#
# clean.sh : kernel/ 밑에서 작업하는 것으로 셋팅되어 있음.
#
###########################################################
export ARCH=arm
export CROSS_COMPILE=arm-eabi-
export KERNEL_BUILD_ID=hasu0707
export TOOLCHAIN=/opt/kernel_lg_f260s_v20d_kitkat/arm-eabi-4.7
export PATH=${TOOLCHAIN}/bin:${PATH}

make mrproper

if [ -d ./${KERNEL_BUILD_ID}/ ]
then
    rm -rf ./${KERNEL_BUILD_ID}/
fi

if [ -f ./zImage ]
then
    rm ./zImage
fi

if [ -f ./new_boot.img ]
then
    rm -rf ./new_boot.img
fi

rm -f ./arch/arm/configs/${KERNEL_BUILD_ID}_defconfig
rm -f ./${KERNEL_BUILD_ID}_kernel.log
위로 스크롤