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
타겟보드 업데이트하기
아래와 같은 순서로 작업한다.
- sd card 어댑터를 분리하여 mini sd card 를 타겟에 꼽는다. 이때 lucas2 전용 키보드를 타겟에 연결한다.
- 전원을 켜고 'power + esc + reload' 또는 'power + reload' 버튼을 동시에 누른다. 재부팅 될 것이다.
- 재부팅 되는 동안에, 'ctrl + u' 를 누르면, mini sd card 로 부팅이 된다.
- root 로 로그인하고, 만일 비밀번호를 물어본다면, 'test0000' 로 입력한다. 그리고 'chromeos-install' 를 실행한다.
- 설치가 끝나면, 재부팅한다.
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 테스트 하기
아래와 같은 순서로 실행한다.
- 보드가 부팅하면, 마법사 창에서 ap scan 이후, 아무 ap 에나 접속한다.
- 'continue' 를 누르고, 이후 skip 을 위해 'esc' 키를 누르고, 'continue' 를 선택한다.
- 마법사를 끝내고 난 후, 'ctrl + alt + t' 를 누르면, 터미널 창이 뜨는데, 아래와 같이 실행한다.
$shell $sudo -i #suspend_stress_test
만일 수행도중 커널 패닉으로 인해 재부팅이 된다면, 아래의 경로에서 로그를 확인할 수 있다.
- '/dev/pstore/console-ramoops'
- '/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 별로 바이너리 이미지를 다운로드 할 수 있다.
에 접속하면, 프로젝트별로 이미지를 받을 수 있다. 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