티스토리 뷰
타이젠 위키에서 포팅 가이드(https://wiki.tizen.org/Quick_guide_for_odroidxu4#Download_boot_and_platform_image_for_Tizen_3.0)를 찾을 수 있는데 emmc와 sd카드 두가지를 이용한다.
sd카드에 u-boot를 이용한 부트로더와 커널을 올려놓고 emmc에 부트 이미지와 Tizen 플랫폼 이미지를 올려서 sd 카드로 부팅을 시작한 후에 몇 가지 설정을 거쳐 나중에는 emmc를 이용해서 부팅을 하는 방법이다.
그러나 SD카드 밖에 없는 상황이라서 SD카드에 전부 다 집어 넣으려고 한다.
1. 필요한 파일 다운로드
오드로이드 제조사인 하드커널에서 제공하는 부트로더 binary 파일들을 다운로드 받는다
$ wget https://github.com/hardkernel/u-boot/raw/odroidxu3-v2012.07/sd_fuse/hardkernel_1mb_uboot/bl1.bin.hardkernel
$ wget https://github.com/hardkernel/u-boot/raw/odroidxu3-v2012.07/sd_fuse/hardkernel_1mb_uboot/bl2.bin.hardkernel.1mb_uboot
$ wget https://github.com/hardkernel/u-boot/raw/odroidxu3-v2012.07/sd_fuse/hardkernel_1mb_uboot/tzsw.bin.hardkernel
타이젠 공식 홈페이지에서 제공하는 u-boot와 부트 이미지, 플랫폼 이미지 다운로드(tar파일)
https://download.tizen.org/snapshots/tizen/tv/latest/images/arm-wayland/tv-boot-armv7l-odroidxu3/
2. sd카드에 파디션을 나눠주고 부트로더와 이미지들을 해당 위치에 넣어준다. 직접 파티션을 나누고 u-boot 메뉴얼대로 파일들을 fusing해줘도 되지만 매우 번거롭다. 스크립트를 Tizen wiki에서 제공해주니 복사 붙여넣기 해주자. 파일명은 sd_fusing_xu4.sh로 해서 다운로드 받은 파일들과 같은 폴더에 만들어준다. 파일을 만들어 준 이후에는 실행 가능하도록 만들어주기 위해서
$ chmod u+x sd_fusing_xu4.sh
를 한번 입력해준다.
아래부터 sd_fusing_xu4.sh에 들어가야 하는 소스코드이다
#!/bin/bash
declare FORMAT=""
declare DEVICE=""
# Binaires array for fusing
declare -a FUSING_BINARY_ARRAY
declare -i FUSING_BINARY_NUM=0
declare CONV_ASCII=""
declare -i FUS_ENTRY_NUM=0
declare -r FUSING_IMG="fusing.img"
# binary name | part number | offset | bs
declare -a PART_TABLE=(
"bl1.bin.hardkernel" "" 1 512
"bl2.bin.hardkernel.1mb_uboot" "" 31 512
"u-boot-mmc.bin" "" 63 512
"tzsw.bin.hardkernel" "" 2111 512
"params.bin" "" 6272 512
"boot.img" 1 0 512
"rootfs.img" 2 0 4M
"system-data.img" 3 0 4M
"user.img" 5 0 4M
"modules.img" 6 0 512
$FUSING_IMG "" 3072 512
)
declare -r -i PART_TABLE_ROW=4
declare -r -i PART_TABLE_COL=${#PART_TABLE[*]}/${PART_TABLE_ROW}
# partition table support
function get_index_use_name () {
local -r binary_name=$1
for ((idx=0;idx<$PART_TABLE_COL;idx++)); do
if [ ${PART_TABLE[idx * ${PART_TABLE_ROW} + 0]} == $binary_name ]; then
return $idx
fi
done
# return out of bound index
return $idx
}
# fusing feature
function convert_num_to_ascii () {
local number=$1
CONV_ASCII=$(printf \\$(printf '%03o' $number))
}
function print_message () {
local color=$1
local message=$2
tput setaf $color
tput bold
echo ""
echo $message
tput sgr 0
}
function add_fusing_entry () {
local name=$1
local offset=$2
local size=$3
FUS_ENTRY_NUM=$((FUS_ENTRY_NUM + 1))
echo -n "$name" > entry_name
cat entry_name /dev/zero | head -c 32 >> entry
echo -n "" > entry_offset
for ((i=0; i < 4; i++))
do
declare -i var;
var=$(( ($offset >> (i*8)) & 0xFF ))
convert_num_to_ascii $var
echo -n $CONV_ASCII > tmp
cat tmp /dev/zero | head -c 1 >> entry_offset
done
cat entry_offset /dev/zero | head -c 4 >> entry
echo -n "" > entry_size
for ((i=0; i < 4; i++))
do
declare -i var;
var=$(( ($size >> (i*8)) & 0xFF ))
convert_num_to_ascii $var
echo -n $CONV_ASCII > tmp
cat tmp /dev/zero | head -c 1 >> entry_size
done
cat entry_size /dev/zero | head -c 4 >> entry
rm tmp
rm entry_name
rm entry_offset
rm entry_size
}
function make_fusing_header () {
# header magic
echo -n "BFUS" > fus_hdr_magic
cat fus_hdr_magic | head -c 4 > fus_hdr
# entry number: 1 byte
convert_num_to_ascii $FUS_ENTRY_NUM
echo -n $CONV_ASCII > fus_hdr_entry_num
cat fus_hdr_entry_num /dev/zero | head -c 4 >> fus_hdr
rm fus_hdr_magic
rm fus_hdr_entry_num
}
function make_fusing_struct {
if [ -f entry ];then
make_fusing_header
cat fus_hdr entry /dev/zero | head -c 512 > $FUSING_IMG
rm fus_hdr entry
# Write Fusing Magic Number */
fusing_image $FUSING_IMG
rm $FUSING_IMG
fi
}
function fusing_image () {
local -r fusing_img=$1
# get binary info using basename
get_index_use_name $(basename $fusing_img)
local -r -i part_idx=$?
if [ $part_idx -ne $PART_TABLE_COL ];then
local -r device=$DEVICE${PART_TABLE[${part_idx} * ${PART_TABLE_ROW} + 1]}
local -r seek=${PART_TABLE[${part_idx} * ${PART_TABLE_ROW} + 2]}
local -r bs=${PART_TABLE[${part_idx} * ${PART_TABLE_ROW} + 3]}
else
echo "Not supported binary: $fusing_img"
return
fi
local -r input_size=`du -b $fusing_img | awk '{print $1}'`
print_message 2 "[Fusing $1]"
dd if=$fusing_img | pv -s $input_size | dd of=$device seek=$seek bs=$bs
if [ $(basename $fusing_img) == "u-boot-mmc.bin" ];then
add_fusing_entry "u-boot" $seek 2048
fi
}
function fuse_image_tarball () {
local -r filepath=$1
local -r temp_dir="tar_tmp"
mkdir -p $temp_dir
tar xvf $filepath -C $temp_dir
cd $temp_dir
for file in *
do
fusing_image $file
done
cd ..
rm -rf $temp_dir
eval sync
}
function fuse_image () {
if [ "$FUSING_BINARY_NUM" == 0 ]; then
return
fi
for ((fuse_idx = 0 ; fuse_idx < $FUSING_BINARY_NUM ; fuse_idx++))
do
local filename=${FUSING_BINARY_ARRAY[fuse_idx]}
case "$filename" in
*.tar | *.tar.gz)
fuse_image_tarball $filename
;;
*)
fusing_image $filename
;;
esac
done
echo ""
}
# partition format
function mkpart_3 () {
local -r DISK=$DEVICE
local -r SIZE=`sfdisk -s $DISK`
local -r SIZE_MB=$((SIZE >> 10))
local -r BOOT_SZ=64
local -r ROOTFS_SZ=3072
local -r DATA_SZ=512
local -r MODULE_SZ=20
let "USER_SZ = $SIZE_MB - $BOOT_SZ - $ROOTFS_SZ - $DATA_SZ - $MODULE_SZ - 4"
local -r BOOT=boot
local -r ROOTFS=rootfs
local -r SYSTEMDATA=system-data
local -r USER=user
local -r MODULE=modules
if [[ $USER_SZ -le 100 ]]
then
echo "We recommend to use more than 4GB disk"
exit 0
fi
echo "========================================"
echo "Label dev size"
echo "========================================"
echo $BOOT" " $DISK"1 " $BOOT_SZ "MB"
echo $ROOTFS" " $DISK"2 " $ROOTFS_SZ "MB"
echo $SYSTEMDATA" " $DISK"3 " $DATA_SZ "MB"
echo "[Extend]"" " $DISK"4"
echo " "$USER" " $DISK"5 " $USER_SZ "MB"
echo " "$MODULE" " $DISK"6 " $MODULE_SZ "MB"
local MOUNT_LIST=`mount | grep $DISK | awk '{print $1}'`
for mnt in $MOUNT_LIST
do
umount $mnt
done
echo "Remove partition table..."
dd if=/dev/zero of=$DISK bs=512 count=16 conv=notrunc
# NOTE: if your sfdisk version is less than 2.26.0, then you should use following sfdisk command:
# sfdisk --in-order --Linux --unit M $DISK <<-__EOF__
# NOTE: sfdisk 2.26 doesn't support units other than sectors and marks --unit option as deprecated.
# The input data needs to contain multipliers (MiB) instead.
sfdisk $DISK <<-__EOF__
4MiB,${BOOT_SZ}MiB,0xE,*
8MiB,${ROOTFS_SZ}MiB,,-
8MiB,${DATA_SZ}MiB,,-
8MiB,,E,-
,${USER_SZ}MiB,,-
,${MODULE_SZ}MiB,,-
__EOF__
mkfs.vfat -F 16 ${DISK}1 -n $BOOT
mkfs.ext4 -q ${DISK}2 -L $ROOTFS -F
mkfs.ext4 -q ${DISK}3 -L $SYSTEMDATA -F
mkfs.ext4 -q ${DISK}5 -L $USER -F
mkfs.ext4 -q ${DISK}6 -L $MODULE -F
}
function show_usage () {
echo "- Usage:"
echo " sudo ./sd_fusing*.sh -d <device> [-b <path> <path> ..] [--format]"
}
function check_partition_format () {
if [ "$FORMAT" != "2" ]; then
echo "-----------------------"
echo "Skip $DEVICE format"
echo "-----------------------"
return 0
fi
echo "-------------------------------"
echo "Start $DEVICE format"
echo ""
mkpart_3
echo "End $DEVICE format"
echo "-------------------------------"
echo ""
}
function check_args () {
if [ "$DEVICE" == "" ]; then
echo "$(tput setaf 1)$(tput bold)- Device node is empty!"
show_usage
tput sgr 0
exit 0
fi
if [ "$DEVICE" != "" ]; then
echo "Device: $DEVICE"
fi
if [ "$FUSING_BINARY_NUM" != 0 ]; then
echo "Fusing binary: "
for ((bid = 0 ; bid < $FUSING_BINARY_NUM ; bid++))
do
echo " ${FUSING_BINARY_ARRAY[bid]}"
done
echo ""
fi
if [ "$FORMAT" == "1" ]; then
echo ""
echo "$(tput setaf 3)$(tput bold)$DEVICE will be formatted, Is it OK? [y/n]"
tput sgr 0
read input
if [ "$input" == "y" ] || [ "$input" == "Y" ]; then
FORMAT=2
else
FORMAT=0
fi
fi
}
function print_logo () {
echo ""
echo "Odroid-XU4 downloader, version 0.5"
echo "Authors: Inha Song <ideal.song@samsung.com>"
echo ""
}
print_logo
function add_fusing_binary() {
local declare binary_name=$1
FUSING_BINARY_ARRAY[$FUSING_BINARY_NUM]=$binary_name
FUSING_BINARY_NUM=$((FUSING_BINARY_NUM + 1))
}
declare -i binary_option=0
while test $# -ne 0; do
option=$1
shift
case $option in
--f | --format)
FORMAT="1"
binary_option=0
;;
-d)
DEVICE=$1
binary_option=0
shift
;;
-b)
add_fusing_binary $1
binary_option=1
shift
;;
*)
if [ $binary_option == 1 ];then
add_fusing_binary $option
else
echo "Unkown command: $option"
exit
fi
;;
esac
done
check_args
check_partition_format
fuse_image
make_fusing_struct
3. sd 카드를 포맷시킨다.
$ sudo fdisk -l
명령어를 실행하면 sd카드의 위치가 나오는데, /dev/sda 혹은 /dev/sdb 하고 뒤에 숫자가 붙어있다. 숫자는 파티션 번호를 의미한다.
$ sudo dd if=/dev/zero of=/dev/sdX bs=1024MB count=8
명령어로 sd카드를 로우레벨 포맷 해줄 수 있다. X를 fdisk의 결과에서 숫자를 제외하고 맞춰주면 된다. 8기가 sd카드를 포맷하는데에도 꽤나 오랜 시간이 걸림.
4. sd카드 파티션 나눠주기
$ sudo ./sd_fusing_xu4.sh -d /dev/sdX --format
이번에도 역시 X를 자기 컴퓨터에 맞게 바꿔준다
5. sd 카드에 u-boot, boot 이미지, 커널 이미지 넣어주기
$ sudo ./sd_fusing_xu4.sh -d /dev/sdX -b tizen-tv_20170404.1_tv-boot-armv7l-odroidxu3.tar.gz tizen-tv_20170404.1_tv-wayland-armv7l-odroidu3.tar.gz
6. 오드로이드 xu4용 부트로더 파일들 넣어주기
$ sudo ./sd_fusing_xu4.sh -d /dev/sdX -b bl1.bin.hardkernel bl2.bin.hardkernel.1mb_uboot tzsw.bin.hardkernel
7. SD카드를 Odroid에 꽂고 전원을 연결시켜주면 부팅이 완료된다 hdmi케이블로 모니터와 연결하면 부팅 완료된 타이젠 화면을 볼 수 있음
- Total
- Today
- Yesterday
- Introduction to algorithms
- codewars
- 멜킨스포츠
- introduction to algorithms third edtion
- conda
- anaconda
- CHUWI HI8
- 하스스톤
- 마스터킹
- 개봉기
- 연습문제
- 치닝디핑
- PYTHON
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |