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인치부터 설명하겠다.
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 여개가 넘는 패키지를 일일이 다운로드 받아 빌드하게 되는데, 이때 방화벽이 없는 네트워크 환경에서 진행해야 한다.
패키지 빌드가 거의 끝날 무렵 에러가 발생하게 되는데, 이때 앞서 언급한 패치 파일이 필요하다. 패치 방법은 아래와 같다.
새로운 터미널 창을 하나 열어서 작업한다.
$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
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}" #}
에러없이 빌드되었다면, /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
아래와 같은 순서로 작업한다.
이번에는 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
반복 작업의 수고를 덜고 소요시간을 단축하기 위해 몇 가지 스크립트 파일을 만들었다.
cros_sdk 로 진입할 때, 사용하기 위해 만들었다.
pit 는 11 인치용 빌드 시 사용하고, pi 는 13 인치용 빌드 시 사용한다. 이 파일들은 '/home/lucas/depot_tools' 아래에 복사한다.
사용방법은 lucas 계정으로 로그인 후, 어디서든 pit 또는 pi 를 실행하면 된다.
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' 아래에 복사한다.
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
/mnt/host/source/src/third_party/chromiumos-overlay/chromeos/config/make.conf.arm-target 파일에 다음을 추가한다.
ACCEPT_LICENSE="*"
'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' 파일을 찾아 수정하면 된다.
아래와 같은 순서로 실행한다.
$shell $sudo -i #suspend_stress_test
만일 수행도중 커널 패닉으로 인해 재부팅이 된다면, 아래의 경로에서 로그를 확인할 수 있다.
dtsi 파일을 생성하기 위해서는 기준이 되는 conf 파일이 필요하다. mlanutl 명령어를 아래와 같이 실행하면, 'marvell_txpwrlimit.dtsi' 파일이 생성된다.
#./mlanutl mlan0 hostcmd txpwrlimit_cfg_set_w8897_default.conf generate_raw marvell_txpwrlimit.dtsi
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 디렉토리 아래의 파일에 적용되었다.
이슈 발생 시, 문제 원인을 파악하기 위해 관련 커널 옵션을 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 되는 것을 방지한다.
각 대역별로 신호세기를 조정할 수가 있는데, 이를 위해서는 몇 가지 수정 작업이 필요하다.
먼저 신호세기 설정 파일인 '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 파일을 아래와 같이 수정하면 된다.
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 로 설정된다.
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 ...
앞서 설명한 방법은 '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 시 lock 에러가 발생하는 경우가 있다. 이럴 때는 아래와 같이 실행하면 된다.
# echo 0 > /proc/sys/kernel/chromiumos/module_locking
기존 보드와는 달리 MP 이상 보드에서는 기존의 방식으로 binary 업데이트가 불가능하다. 아래와 같이 실행해야 한다.
#crossystem dev_boot_usb=1 #sync #reboot
재부팅한 다음, 'Ctrl + u' 를 입력하면 기존과 동일한 방식으로 업데이트가 가능하다.
번거롭게 이미지를 빌드할 필요없이 각 revision 별로 바이너리 이미지를 다운로드 할 수 있다.
에 접속하면, 프로젝트별로 이미지를 받을 수 있다. chromiumos_test_image.bin 파일 받으면 된다.
이미지 설치 도중, 'Error : kernel verification blob not found in stateful partition' 에러가 발생하면, 아래와 같이 실행한다.
#chromeos-install --skip_vblock
'/etc/lsb-release' 파일을 보면, 현재 chromeos 바이너리 릴리즈 버전을 알 수 있다. 드라이버 버전을 확인하기 위해서는 아래의 명령어로 확인가능하다.
#dmesg | grep driver_version