Table of Contents

lucas2 개발을 위한 환경 구축 및 빌드 방법에 대해 다룬다. PC 플랫폼을 타겟으로 개발하고 싶다면, Chrome OS 핵심가이드 문서를 참고하기 바란다.

준비운동 하기

본격적인 설명을 시작하기 전에 참고로 이 문서는 아래의 환경에서 진행했다.

CPU 64bit
OS Ubuntu 13.10

환경 빌드 과정에서 필요한 파일들이 있는데, 이 파일들은 아래의 명령어로 내려 받을 수 있다.

#git clone /ssd/git/ ./
#cd lucas/make_build_environment
#tar xf jeremy.tar
#cd jeremy
#ls
0002-TEMP-Don-t-build-touchpad_firmware_pit-due-to-downlo.patch  local_manifest.xml  local_manifest.xml-bt-pi  ssh.tar

위 파일들에 대한 설명은 아래 표를 참고한다.

파일명 설명
0002-TEMP-Don-t-build-touchpad_firmware_pit-due-to-downlo.patch build_package 과정에서 에러 발생 시 사용하는 패치파일
local_manifest.xml 다운로드 할 소스코드를 지정하는 파일, 11인치 전용
local_manifest.xml-bt-pi 다운로드 할 소스코드를 지정하는 파일, 13인치 전용
ssh.tar ssh 를 이용해서 소스코드를 받아올 때 삼성 이혁주 책임의 계정으로 로그인하기 위해 필요한 파일들
.netrc 숨겨진 파일로서, git 서버 접근 시 사용하는 계정과 비밀번호가 적힌 파일

위의 파일들이 필요한 이유는 git 서버에서 lucas 소스코드를 내려받기 위해서는 인증된 계정으로 접속해야 하기 때문이다. 여기서는 삼성의 이혁주 책임의 계정을 사용할 것이다.

lucas 의 소스코드는 각각 11 인치와 13 인치로 구분된다. 따라서 각각의 개발환경을 만들어야 한다. 당연히 빌드도 각각 해주어야 한다. 구축 경로는 아래와 표와 같다.

peach-pit(11인치) /home/lucas/lucas2_pit
peach-pi(13인치) /home/lucas/lucas2_pi

먼저 11인치부터 설명하겠다.

11인치(peach-pit)

계정 생성

lucas 개발 과정은 일반 유저 모드에서 이루어진다. 따라서 만일 root 계정이라면, lucas 개발 시 사용할 계정을 별도로 만들어야 한다.

#adduser lucas
#passwd lucas
#su - lucas
$sudo apt-get install git-core gitk git-gui subversion curl
$git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$vi ~/.bashrc                        // 마지막 줄에 export PATH="$PATH":/home/lucas/depot_tools 추가
$su - lucas
$git config --global user.email "hyuckjoolee345@gmail.com"
$git config --global user.name "hyuckjoolee"
$mkdir ~/lucas2_pit
$cd lucas2_pit

환경 설정 파일 복사 및 코드 내려 받기

앞서 언급한 jeremy.tar 아래의 파일들을 복사해야 한다.

$ls
0002-TEMP-Don-t-build-touchpad_firmware_pit-due-to-downlo.patch  local_manifest.xml  local_manifest.xml-bt-pi  ssh.tar
$tar xf ssh.tar -C /home/lucas
$cp .netrc /home/lucas
$sync
$cd /home/lucas/lucas2_pit
$repo init -u https://chromium.googlesource.com/chromiumos/manifest.git --repo-url https://chromium.googlesource.com/external/repo.git
$cp /home/lucas/jeremy/local_manifest.xml .repo/
$repo sync
$cd /home/lucas/jeremy/
$sudo cp b11.sh /home/lucas/lucas2_pit/chroot/bin/
$cp pi pit /home/lucas/depot_tools/
$cd -
$./chromite/bin/cros_sdk

툴체인을 내려받아 설치할 것이다. 설치가 완료되면, 아래와 같은 프롬프트가 보인다. 빠져나갔다가, –enter 옵션을 추가하여 다시 실행한다.

(cr) ((d044d58...)) $ exit
$./chromite/bin/cros_sdk --enter

패키지 빌드 및 패치, 이미지 생성하기

(cr) ((d044d58...)) $ ./setup_board --board=peach_pit
(cr) ((d044d58...)) $ ./build_packages --board=peach_pit

장시간이 소요되는 과정으로서 500 여개가 넘는 패키지를 일일이 다운로드 받아 빌드하게 되는데, 이때 방화벽이 없는 네트워크 환경에서 진행해야 한다.

패치 적용하기

pit 일 경우

패키지 빌드가 거의 끝날 무렵 에러가 발생하게 되는데, 이때 앞서 언급한 패치 파일이 필요하다. 패치 방법은 아래와 같다.
새로운 터미널 창을 하나 열어서 작업한다.

$cp 0002-TEMP-Don-t-build-touchpad_firmware_pit-due-to-downlo.patch src/private-overlays/overlay-variant-peach-pit-private/
$./chromite/bin/cros_sdk --enter
(cr) ((d044d58...)) $ cd ../private-overlays/overlay-variant-peach-pit-private/
(cr) ((d044d58...)) $git am 0002-TEMP-Don-t-build-touchpad_firmware_pit-due-to-downlo.patch

패치 후 원래 빌드하던 터미널 창으로 돌아와 다시 빌드한다.

(cr) ((d044d58...)) $ ./build_packages --board=peach_pit
(cr) ((d044d58...)) $ ./build_image --board=peach_pit --noenable_rootfs_verification test

pi 일 경우

pit 에서 사용한 patch 파일을 그대로 사용하지 않고, patch 파일의 해당 경로를 수정해야 한다. '/home/lucas/trunk/src/private-overlays/overlay-variant-peach-pi-private/chromeos-base/chromeos-touch-firmware-pi/chromeos-touch-firmware-pi-0.0.1.ebuild' 파일을 수작업으로 patch 파일을 적용했다.

# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2
 
EAPI=4
 
#inherit cros-binary
 
DESCRIPTION="Ebuild that installs the chromeos touch firmware payload."
 
LICENSE="BSD"
SLOT="0"
KEYWORDS="arm"
IUSE=""
 
DEPEND="chromeos-base/chromeos-touch-config-pi"
 
RDEPEND="${DEPEND}
     chromeos-base/touch_updater"
 
PRODUCT_ID_TP="130.44"
FIRMWARE_VERSION_TP="3.0.170"
 
CROS_BINARY_URI="${CATEGORY}/${PN}/${PF}.tbz2"
CROS_BINARY_INSTALL_FLAGS="--strip-components=1"
 
#cros-binary_add_gs_uri bcs-pi-private overlay-variant-peach-pi-private \
#   "${CROS_BINARY_URI}"
 
TP_FW_NAME="${PRODUCT_ID_TP}_${FIRMWARE_VERSION_TP}.bin"
TP_SYM_LINK_PATH="/lib/firmware/maxtouch-tp.fw"
 
S=${WORKDIR}
 
#src_install() {
#   cros-binary_src_install
 
    # Create symlink at /lib/firmware to the firmware binary for tp.
#   dosym "/opt/google/touch/firmware/${TP_FW_NAME}" "${TP_SYM_LINK_PATH}"
 
#}

이미지를 sd card 에 write

에러없이 빌드되었다면, /home/lucas/trunk/src/build/images/peach_pit/latest 디렉토리에 생성된 이미지 파일(chromiumos_test_image.bin)을 발견할 수 있다.
이미지를 타겟보드에 쓰기 위해서는 mini sd card 에 써야 한다.

개발 PC 에서는 mini sd card 슬롯이 없기 때문에 sd 카드 어댑터나 usb 컨버터를 사용해야 한다. sd 카트 어댑터를 사용할 경우, cros_sdk 환경에서는 /dev/mmc 디바이스를 인식하지 못한다. 따라서 외부로 이미지 파일을 복사해야 하는 번거로움이 생긴다.
usb 컨버터를 사용하면, cros_sdk 환경에서 바로 인식이 가능하기 때문에 바로 이미지를 write 할 수 있다. 인식한 usb 컨버터가 /dev/sdc 라면, 아래와 같이 명령한다.
여기서 유의할 점은 특정 파티션(sdc1, sdc2)이 아닌 전체 디바이스(/dev/sdc)를 지정해야 한다는 것이다. 이것은 /dev/mmc 도 마찬가지다.

$sudo pv /home/lucas/trunk/src/build/images/peach_pit/latest/chromiumos_test_image.bin | sudo  dd of=/dev/sdc bs=8M     
 
또는
 
$sudo pv /home/lucas/trunk/src/build/images/peach_pit/latest/chromiumos_test_image.bin | sudo  dd of=/dev/mmcblk0 bs=8M     

타겟보드 업데이트하기

아래와 같은 순서로 작업한다.

  1. sd card 어댑터를 분리하여 mini sd card 를 타겟에 꼽는다. 이때 lucas2 전용 키보드를 타겟에 연결한다.
  2. 전원을 켜고 'power + esc + reload' 또는 'power + reload' 버튼을 동시에 누른다. 재부팅 될 것이다.
  3. 재부팅 되는 동안에, 'ctrl + u' 를 누르면, mini sd card 로 부팅이 된다.
  4. root 로 로그인하고, 만일 비밀번호를 물어본다면, 'test0000' 로 입력한다. 그리고 'chromeos-install' 를 실행한다.
  5. 설치가 끝나면, 재부팅한다.

13인치(peach-pi)

이번에는 13인치에 대한 개발환경을 구축해보겠다. 앞서 11인치에 대한 개발환경 구축 완료를 가정하고 설명하겠다.

$cd
$mkdir peach_pi_pv                // 디렉토리 생성(반드시 peach_pit_pv 와 같은 폴더 depth 에서 생성함)
$cd peach_pi_pv
$repo init -u https://chromium.googlesource.com/chromiumos/manifest.git --repo-url https://chromium.googlesource.com/external/repo.git
$cp /home/lucas/jeremy/local_manifest.xml-bt-pi .repo/local_manifest.xml
$repo sync
$cd /home/lucas/jeremy/
$sudo cp b13.sh /home/lucas/lucas2_pi/chroot/bin/
$cd -
$./chromite/bin/cros_sdk
(cr) ((d044d58...)) $ exit
$./chromite/bin/cros_sdk --enter
(cr) ((d044d58...))./setup_board --board=peach_pi
(cr) ((d044d58...))./build_package --board=peach_pi
(cr) ((d044d58...))./build_image --board=peach_pi --noenable_rootfs_verification test

커널 컴파일 하기

커널 옵션을 수정 시, 아래와 같은 절차로 커널 빌드를 할 수 있다. 기본적으로 커널을 수정하더라도 '로컬 빌드 선언' 을 하지 않으면, git 서버에 있는 소스코드를 가져와 빌드하기 때문에 수정사항이 반영이 안된다.
반드시 '원격이 아닌 로컬에 있는 커널 소스를 빌드하겠다고 선언' 해야 한다.

$./chromit/bin/cros_sdk --enter       // 빌드체인 환경 진입
$cd ~/trunk/src/third_party/kernel-next        // 커널 디렉토리로 이동
$git branch -a                     // all 브렌치 검색
$git checkout -b my_local_branch_02_13 cros/chromeos-3.8              // master branch 가져옴
$cros_workon-peach_pit  list --all | grep kernel-next               // 커널 next 패키지 검색
$cros_workon-peach_pit start  sys-kernel/chromeos-kernel-next         // 커널 next 패키지 로컬 빌드 선언
$emerge-peach_pit sys-kernel/chromeos-kernel-next             // 커널next 빌드 시작
$~/trunk/src/scripts/build_image --board=peach_pit --noenable_rootfs_verification test

커널 빌드 도중 에러 발생 시

커널 옵션을 여러 번 수정하다보면, 커널 빌드 과정에서 에러가 발생할 수 있다. 이럴 때는 아래와 같이 실행 후 재 빌드해보자.

$cd ~/trunk/src/third_party/kernel-next    
$make mrproper

스크립트 파일

반복 작업의 수고를 덜고 소요시간을 단축하기 위해 몇 가지 스크립트 파일을 만들었다.

pit, pi

cros_sdk 로 진입할 때, 사용하기 위해 만들었다.
pit 는 11 인치용 빌드 시 사용하고, pi 는 13 인치용 빌드 시 사용한다. 이 파일들은 '/home/lucas/depot_tools' 아래에 복사한다.
사용방법은 lucas 계정으로 로그인 후, 어디서든 pit 또는 pi 를 실행하면 된다.

kb11.sh, kb13.sh

cros_sdk 에 진입하여 커널 및 바이너리 이미지를 빌드하고, 생성된 이미지 파일을 usb mini sd card 에 쓰는 것까지를 수행한다.
kb11.sh 는 11 인치용이고, kb13.sh 는 13 인치용이다.

'kb11.sh' 파일은 '/home/lucas/lucas2_pit/chroot/bin' 아래에 복사하고, 'kb13.sh' 파일은 '/home/lucas/lucas2_pi/chroot/bin' 아래에 복사한다.

FAQ

lucas is not in the sudoers file. This incident will be reported. 에러 발생 시

lucas@ubuntu:~/lucas2_pit$ ./chromite/bin/cros_sdk 
[sudo] password for lucas: 
lucas is not in the sudoers file.  This incident will be reported.

위와 같은 에러 발생 시, /etc/sudoers 파일을 아래와 같이 수정한다. 이 파일의 퍼미션이 440 임에 유의하자.

# User privilege specification
root    ALL=(ALL:ALL) ALL 
lucas   ALL=(ALL:ALL) ALL            // 추가
 
# Members of the admin group may gain root privileges

build_packages 에서 The following license changes are necessary to proceed 에러 발생 시

/mnt/host/source/src/third_party/chromiumos-overlay/chromeos/config/make.conf.arm-target 파일에 다음을 추가한다.

ACCEPT_LICENSE="*"

AccessDenied 에러 발생 시

'build_packages' 실행 시 아래와 같은 에러 메세지가 발생할 수 있다.

'Boto:num_retries=10' -m cp -r -e -- gs://chromeos-binaries/HOME/bcs-pit-private/overlay-variant-peach-pit-private/chromeos-base/chromeos-firmware-pit/
chromeos-firmware-pit-0.0.1-r18: 09:58:08: INFO: (stderr):
chromeos-firmware-pit-0.0.1-r18: GSResponseError: status=403, code=AccessDenied, reason="Forbidden", message="Access denied."
chromeos-firmware-pit-0.0.1-r18:
chromeos-firmware-pit-0.0.1-r18: 09:58:08: WARNING: GS_ERROR: GSResponseError: status=403, code=AccessDenied, reason="Forbidden", message="Access denied."
chromeos-firmware-pit-0.0.1-r18:
chromeos-firmware-pit-0.0.1-r18: 09:58:08: ERROR: return code: 1
chromeos-firmware-pit-0.0.1-r18: GSResponseError: status=403, code=AccessDenied, reason="Forbidden", message="Access denied."
chromeos-firmware-pit-0.0.1-r18:
chromeos-firmware-pit-0.0.1-r18: Failed command "/mnt/host/source/.cache/common/gsutil_3.38.tar.gz/gsutil/gsutil -o 'GSUtil:parallel_co
chromeos-firmware-pit-0.0.1-r18: !!! Couldn't download 'pit_fw_4482.90.0.tbz2'. Aborting.
chromeos-firmware-pit-0.0.1-r18:  * Fetch failed for 'chromeos-base/chromeos-firmware-pit-0.0.1-r18', Log file:
chromeos-firmware-pit-0.0.1-r18:  *  '/build/peach_pit/tmp/portage/logs/chromeos-base:chromeos-firmware-pit-0.0.1-r18:20140311-005045.log'
chromeos-firmware-pit-0.0.1-r18: >>> Failed to emerge chromeos-base/chromeos-firmware-pit-0.0.1-r18 for /build/peach_pit/, Log file:
chromeos-firmware-pit-0.0.1-r18: >>>  '/build/peach_pit/tmp/portage/logs/chromeos-base:chromeos-firmware-pit-0.0.1-r18:20140311-005045.log'
chromeos-firmware-pit-0.0.1-r18:
chromeos-firmware-pit-0.0.1-r18:  * Messages for package chromeos-base/chromeos-firmware-pit-0.0.1-r18 merged to /build/peach_pit/:
chromeos-firmware-pit-0.0.1-r18:
chromeos-firmware-pit-0.0.1-r18:  * Fetch failed for 'chromeos-base/chromeos-firmware-pit-0.0.1-r18', Log file:
chromeos-firmware-pit-0.0.1-r18:  *  '/build/peach_pit/tmp/portage/logs/chromeos-base:chromeos-firmware-pit-0.0.1-r18:20140311-005045.log'
=== Complete: job chromeos-firmware-pit-0.0.1-r18 (7m23.1s) ===
Failed chromeos-base/chromeos-firmware-pit-0.0.1-r18 (in 7m23.1s). Your build has failed.
Pending 3/3, [Time 27m0.2s Load 0.0 0.01 0.05]
Packages failed:
        chromeos-base/chromeos-firmware-pit-0.0.1-r18
ERROR   : script called: ./build_packages '--board=peach_pit'
ERROR   : Backtrace:  (most recent call is last)
ERROR   :   file build_packages, line 260, called: die_err_trap '[[ $# -eq 0 ]]' '1'
ERROR   :
ERROR   : Command failed:
ERROR   :   Command '[[ $# -eq 0 ]]' exited with nonzero code: 1
(cr) ((ca6f8c7...)) lucas@lucas ~/trunk/src/scripts $ 

이런 경우에는 'private-overlays/overlay-variant-peach-pit-private/virtual/chromeos-firmware/chromeos-firmware-3.5.ebuild' 파일을 아래와 같이 수정한다.

...
LICENSE="BSD"
SLOT="0"
KEYWORDS="arm"
RDEPEND="chromeos-base/chromeos-firmware-null"       // 수정

위의 수정 사항은 해당 패키지를 빌드하지 말라는 설정이다. 따라서 적용 후 재빌드하면, 해당 패키지를 빌드하지 않고 넘어간다. 만일 이후 다른 패키지에서 'AccessDenied 에러' 가 발생한다면, 위와 같이 해당패키지의 '.ebuild' 파일을 찾아 수정하면 된다.

suspend, resume 테스트 하기

아래와 같은 순서로 실행한다.

  1. 보드가 부팅하면, 마법사 창에서 ap scan 이후, 아무 ap 에나 접속한다.
  2. 'continue' 를 누르고, 이후 skip 을 위해 'esc' 키를 누르고, 'continue' 를 선택한다.
  3. 마법사를 끝내고 난 후, 'ctrl + alt + t' 를 누르면, 터미널 창이 뜨는데, 아래와 같이 실행한다.
$shell
$sudo -i
#suspend_stress_test

만일 수행도중 커널 패닉으로 인해 재부팅이 된다면, 아래의 경로에서 로그를 확인할 수 있다.

  1. '/dev/pstore/console-ramoops'
  2. '/var/log/messages'

power table 파일(.dtsi) 생성하기

dtsi 파일을 생성하기 위해서는 기준이 되는 conf 파일이 필요하다. mlanutl 명령어를 아래와 같이 실행하면, 'marvell_txpwrlimit.dtsi' 파일이 생성된다.

#./mlanutl mlan0 hostcmd txpwrlimit_cfg_set_w8897_default.conf generate_raw marvell_txpwrlimit.dtsi

marvell patch 적용하기

marvell 본사 엔지니어로 부터 patch 파일을 받았다. 수정되어야 할 양이 적다면, 수작업으로 일일이 할 수도 있겠지만, 그러기엔 너무나 양이 방대했다.
파일이름은 '0001-UPSTREAM-mwifiex-remove-global-variable-cmd_wait_q_required.patch' 이며, 파일의 내용은 대략 아래와 같다.

 drivers/net/wireless/mwifiex/util.c          |    2 +- 
 17 files changed, 226 insertions(+), 266 deletions(-)
 
diff --git a/drivers/net/wireless/mwifiex/11h.c b/drivers/net/wireless/mwifiex/11h.c
index 8d68307..e76b0db 100644
--- a/drivers/net/wireless/mwifiex/11h.c
+++ b/drivers/net/wireless/mwifiex/11h.c
@@ -73,8 +73,8 @@ static int mwifiex_11h_activate(struct mwifiex_private *priv, bool flag)
 {
    u32 enable = flag;
 
-   return mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB,
-                    HostCmd_ACT_GEN_SET, DOT11H_I, &enable);
+   return mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB,
+               HostCmd_ACT_GEN_SET, DOT11H_I, &enable, true);
 }
 
 /* This functions processes TLV buffer for a pending BSS Join command.
diff --git a/drivers/net/wireless/mwifiex/11n.c b/drivers/net/wireless/mwifiex/11n.c
index 41e9d25..7a70c5a 100644
--- a/drivers/net/wireless/mwifiex/11n.c
+++ b/drivers/net/wireless/mwifiex/11n.c
@@ -541,8 +541,8 @@ int mwifiex_send_addba(struct mwifiex_private *priv, int tid, u8 *peer_mac)
    memcpy(&add_ba_req.peer_mac_addr, peer_mac, ETH_ALEN);
 
    /* We don't wait for the response of this command */
-   ret = mwifiex_send_cmd_async(priv, HostCmd_CMD_11N_ADDBA_REQ,
-                    0, 0, &add_ba_req);
+   ret = mwifiex_send_cmd(priv, HostCmd_CMD_11N_ADDBA_REQ,
+                  0, 0, &add_ba_req, false);
 
    return ret;

위의 내용에서 유의깊게 봐야할 부분이 있다. 그것은 바로 patch 파일을 만든 경로와 이후, patch 를 적용할 경로이다. 경로를 보면 'a/drivers/net/wireless/mwifiex/11h.c b/drivers/net/wireless/mwifiex/11h.c' 이다.

다시 말해 패치 파일은 커널의 최상위 디렉토리에서 만들었으며, 원래의 커널 디렉토리 이름(kernel-next)이 아닌 a 와 b 라는 디렉토리 이름을 사용한 것을 알 수 있다.
따라서 이 패치 파일을 적용하기 위해서는 패치 파일을 만든 경로와 동일하게 맞춰주어야 에러없이 제대로 패치를 적용할 수 있다. 참고로 그냥 patch 를 적용할 시, 에러가 발생할 것이다.

이를 위해 기존의 kernel-next 디렉토리를 /tmp/test 아래에 복사하고, 이름을 a 로 변경했다. 또한 동일한 디렉토리를 복사하여 b 라는 이름으로 변경하였다.
그리고 아래와 같이 패치를 적용하였다.

$cd /tmp/test
$ls 
a b 0001-UPSTREAM-mwifiex-remove-global-variable-cmd_wait_q_required.patch
$patch -p0 < 0001-UPSTREAM-mwifiex-remove-global-variable-cmd_wait_q_required.patch

패치는 a 디렉토리 아래의 파일에 적용되었다.

kernel debug 옵션 켜기

이슈 발생 시, 문제 원인을 파악하기 위해 관련 커널 옵션을 enable 한다.
kernel-next/chromeos/config 아래의 base.config 파일을 아래와 같이 수정한다.

CONFIG_MMC_DEBUG=y
CONFIG_DYNAMIC_DEBUG=y

만일 위의 옵션 추가 후 커널 빌드 시, 에러가 발생할 수 있다. 이런 경우, 에러가 발생하는 위치를 잘 파악해야 한다.

$emerge-peach_pi sys-kernel/chromeos-kernel-3_8 >& error.txt
$emerge-peach_pi sys-kernel/chromeos-kernel-3_8 >& ok.txt

위와 같이 옵션을 추가하기전과 추가한 후의 차이점을 비교한다. 나의 경우, 'ENXIO' 의 값이 정의되지 않아 에러가 발생했다.
/mnt/host/source/src/third_party/kernel/3.8/arch/arm/kernel/arch_timer.c 파일에 아래와 같이 추가했다.

#include <clocksource/arm_arch_timer.h>
 
#define ENXIO            6                        // 추가
...

커널 빌드 후 부팅 후에 아래와 같이 Debug 기능을 enable 시켜야 한다.

#!/bin/bash
 
echo "module mwifiex +p" > /sys/kernel/debug/dynamic_debug/control
echo "module mwifiex_sdio +p" >/sys/kernel/debug/dynamic_debug/control

추가로 HUNG TASK 관련 옵션을 아래와 같이 수정한다.

CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=0            
CONFIG_DETECT_HUNG_TASK=n
CONFIG_BOOTPARAM_HUNG_TASK_PANIC=n
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0

위와 같이 설정하면, HUNG TASK 에 의해 자동으로 reboot 되는 것을 방지한다.

tx rssi 설정 및 sdr 50/104 조정하기

각 대역별로 신호세기를 조정할 수가 있는데, 이를 위해서는 몇 가지 수정 작업이 필요하다.
먼저 신호세기 설정 파일인 'marvell_txpwrlimit.dtsi' 파일을 '/home/lucas/trunk/src/third_party/kernel-next/arch/arm/boot/dts' 디렉토리 아래에 복사한다.

$cp marvell_txpwrlimit.dtsi /home/lucas/trunk/src/third_party/kernel-next/arch/arm/boot/dts/

그리고 이 파일을 참조하도록 'exynos542x-peach.dtsi' 파일을 수정한다.

/*
 * Common device tree include for all Peach board revisions
 *
 * Copyright (c) 2013 Google, Inc
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
 
#include "marvell_txpwrlimit.dtsi"              // 추가
 
/ {
        aliases {
                i2c20 = &i2c_20;
        };

이번에는 sdr50 또는 sdr104 로 설정하는 방법을 설명한다. exynos542x-peach.dtsi 파일을 아래와 같이 수정하면 된다.

sdr50 일 때

        dwmmc1@12210000 {
                /*
                 * The current best way to ensure that reset/enable and clocks
                 * are available before we try to probe the WiFi card is through
                 * a chain of regulators.
                 */
                vmmc-supply = <&wifi_en_regulator>;
 
                status = "okay";
                num-slots = <1>;
                supports-highspeed;
                supports-sdr50-mode;
/*                supports-sdr104-mode;           */      주석처리함
                keep-power-in-suspend;
...

sdr104 일 때

아래와 같이 수정없이 그대로 두면, sdr104 로 설정된다.

        dwmmc1@12210000 {
                /*
                 * The current best way to ensure that reset/enable and clocks
                 * are available before we try to probe the WiFi card is through
                 * a chain of regulators.
                 */
                vmmc-supply = <&wifi_en_regulator>;
 
                status = "okay";
                num-slots = <1>;
                supports-highspeed;
                supports-sdr50-mode;
                supports-sdr104-mode;
                keep-power-in-suspend;
...

커널 관련 파일 위치(드라이버 빌드 시 참조 경로)

앞서 언급했듯이, lucas2 의 커널 코드위치는 ~/trunk/src/third_party/kernel-next 이다. 커널을 빌드한 후 생성되는 오브젝트 파일(.ko)은 /build/peach_pit/var/cache/portage/sys-kernel/chromeos-kernel-next 에 생성된다.

차후에 wifi 드라이버 및 labtool 을 빌드하기 위해서는 상기 커널 오브젝트 경로를 참조하여야 한다.

커널 옵션 설정 파일 위치

기존의 kernel configuration file(.config) 와는 달리 chromeos 에서는 몇 개의 파일로 나뉘어져 있다.

파일 설명
/home/lucas/trunk/src/third_party/kernel-next/chromeos/config/base.config 전반적인 기능에 대한 옵션 설정을 가짐
/home/lucas/trunk/src/third_party/kernel-next/chromeos/config/armel/common.config arm 아키텍처에 의존적인 기능에 대한 설정을 가짐(WIFI 관련)

위의 표에 언급한 파일들 이외에도 몇가지 파일이 더 있다. 유의깊게 봐야할 것은 WIFI 드라이버 설정이 담긴 common.config 파일이다.

...
CONFIG_MULTI_IRQ_HANDLER=y
# CONFIG_MVMDIO is not set
CONFIG_MWIFIEX=m                // mwifiex.ko
CONFIG_MWIFIEX_SDIO=m        // mwifiex_sdio.ko
# CONFIG_MWIFIEX_USB is not set
CONFIG_NEED_DMA_MAP_STATE=y
...

특정 branch 사용하기

앞서 설명한 방법은 'repo sync' 를 사용하기 때문에 컴파일 당시의 최신 코드를 다운 받게 된다. 만일 특정 브랜치, 다시 말해 특정 패키지의 예전 버전으로 적용하여 빌드하고 싶다면, 다음의 예제를 참고하자.

특정 커널 branch(release-R34-5500.B-chromeos-3.8)로 체크아웃하여 이를 적용한 후 이미지를 만들어야 한다.

$git branch -a                     // all 브렌치 검색
$git checkout -b my_local_branch_02_13 cros/chromeos-3.8              // master branch 가져옴
$cros_workon-peach_pit  list --all | grep kernel-next               // 커널 next 패키지 검색
$git checkout -b local_0317 release-R34-5500.B-chromeos-3.8
new switch local_0317

위와 비슷한 출력이 나온다면, 제대로 특정 branch 로 switch 가 된 것이다. 만일 에러 메세지가 보인다면, branch 이름의 전체 경로를 입력한다.
이후 아래와 같이 실행 후, 커널 컴파일 & 이미지 빌드 한다.

$cros_workon-peach_pit start  sys-kernel/chromeos-kernel-next         // 커널 next 패키지 로컬 빌드 선언
$emerge-peach_pit sys-kernel/chromeos-kernel-next             // 커널next 빌드 시작
$~/trunk/src/scripts/build_image --board=peach_pit --noenable_rootfs_verification test

특정 ko 파일 insmod 하기

직접 빌드한 ko 파일을 insmod 시 lock 에러가 발생하는 경우가 있다. 이럴 때는 아래와 같이 실행하면 된다.

# echo 0 > /proc/sys/kernel/chromiumos/module_locking 

MP 보드에서 binary 이미지 업데이트 하기

기존 보드와는 달리 MP 이상 보드에서는 기존의 방식으로 binary 업데이트가 불가능하다. 아래와 같이 실행해야 한다.

#crossystem dev_boot_usb=1
#sync
#reboot

재부팅한 다음, 'Ctrl + u' 를 입력하면 기존과 동일한 방식으로 업데이트가 가능하다.

Chromeos 이미지 다운로드 받기

번거롭게 이미지를 빌드할 필요없이 각 revision 별로 바이너리 이미지를 다운로드 할 수 있다.

https://www.google.com/chromeos/partner/fe/#release:partner=Select%20All&device=peach-pit&board=Select%20All&channel=dev&type=Select%20All&mstone=R39&ver=&reconly=false&start=0&end=20

에 접속하면, 프로젝트별로 이미지를 받을 수 있다. chromiumos_test_image.bin 파일 받으면 된다.

이미지 설치 중 Error : kernel verification blob not found in stateful partition 에러 발생 시

이미지 설치 도중, 'Error : kernel verification blob not found in stateful partition' 에러가 발생하면, 아래와 같이 실행한다.

#chromeos-install --skip_vblock

Chromeos 버전 확인하기

'/etc/lsb-release' 파일을 보면, 현재 chromeos 바이너리 릴리즈 버전을 알 수 있다. 드라이버 버전을 확인하기 위해서는 아래의 명령어로 확인가능하다.

#dmesg | grep driver_version