eth0 에 고정 IP 주소할당하기(static IP address)

by Blogger 하얀쿠아
2017. 1. 18. 00:52 소프트웨어 Note/Embedded Linux


문제

요약: eth0 에 고정 IP주소(static IP address)를 할당하고자 한다.


지난번 포스팅(http://techlog.gurucat.net/277)을 하면서 판다보드에서 살린 두개의 network interface중에서 eth0 에 '192.168.1.1' 과 같이 고정 IP를 할당하고 싶다.

이유는 PC와 판다보드를 LAN cable을 통해 direct연결 한 후, putty와 같은 툴을 사용해서 ssh shell로 연결 하여 개발을 진행하려고 하는 것이다.

판다보드를 부팅한 후, eth0 에 어떻게 고정 IP를 할당할 수 있는가?


해결


할당하려는 IP는 192.168.1.1 이다.


원래는 bootloader에서 argument 읽은 후 kernel로 argument 전달하는 방식을 택하려 했으나, 일단은 더 간단한 방법을 선택했다.


우선 /etc/network/interfaces 를 편집기로 연다.


root@arm:~# cat /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Include files from /etc/network/interfaces.d:

source-directory /etc/network/interfaces.d


auto lo

iface lo inet loopback


allow-hotplug eth0

iface eth0 inet static

address 192.168.1.1

netmask 255.255.255.0

gateway 192.168.1.255


allow-hotplug wlan0

iface wlan0 inet dhcp


파란 색으로 표시한 것과 같이 기술해 준다.


이상.



재부팅을 하고 확인해보면 아래와 같이 ip address가 할당된 것을 볼 수 있다.


root@arm:~# ifconfig

eth0      Link encap:Ethernet  HWaddr c6:f3:ca:97:cf:67

          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0

          inet6 addr: fe80::c4f3:caff:fe97:cf67/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:226 errors:0 dropped:0 overruns:0 frame:0

          TX packets:32 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:18954 (18.9 KB)  TX bytes:4397 (4.3 KB)


lo        Link encap:Local Loopback

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


wlan0     Link encap:Ethernet  HWaddr de:ad:be:ef:00:00

          UP BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


그런데.. 문제가 있다.

sshd 가 부팅되면서 시작되었다가 곧바로 종료된다.

그래서 ssh shell을 사용하지 못하고, 아직 serial로 연결해서 작업을 진행중이다.



Next Action Item


sshd의 시작 직후 종료되는 원인을 찾고, sshd가 부팅되면서 정상적으로 실행되도록 수정하는 것이다.

이 댓글을 비밀 댓글로

[임베디드/판다보드] Networking Interface Initialize

by Blogger 하얀쿠아
2017. 1. 10. 21:33 소프트웨어 Note/Embedded Linux


문제현상

판다보드에서 리눅스를 부팅한 후, ifconfig로 확인해보면 'lo' 라고 표시되는 loopback interface (127.0.0.1) 만 bring up되고, eth0(ethernet)과 wlan0(Wi-Fi interface)는 자동으로 bring up되지 않는다.

'ifconfig up wlan0', 'ifconfig up eth0' 을 사용해서 커맨드라인에서 수동으로 bring up 을 해보면, 정상적으로 bring up 되는 것을 확인했다.


부팅시퀀스에서 bring up 되도록 하는 방법이 있을 텐데 비활성화 되어 있는 것 같다.

어느 부분을 수정해야 하는지 내가 모르고 있는 것 같아서, 찾아보았다.


해결


우선 판다보드의 네트워크 인터페이스를 확인해보았다.


root@arm:~# ls -l /sys/class/net/

total 0

lrwxrwxrwx 1 root root 0 Feb 11 16:28 eth0 -> ../../devices/platform/44000000.ocp/4a064000.usbhshost/4a064c00.ehci/usb1/1-1/1-1.1/1-1.1:1.0/net/eth0

lrwxrwxrwx 1 root root 0 Feb 11 16:28 lo -> ../../devices/virtual/net/lo

lrwxrwxrwx 1 root root 0 Feb 11 16:28 wlan0 -> ../../devices/platform/44000000.ocp/480d5000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:2/wl12xx.2.auto/net/wlan0




wlan0와 eth0는 존재하는걸 확인했다.

Wi-Fi를 위한 firmware는 rootfs만드는 과정에서 미리 /lib/firmware/ti-connectivity 에 받아 두었으므로 따로 준비할 필요는 없는 상황이다.


root@arm:~# ls -l /lib/firmware/ti-connectivity/

total 8792

-rw-r--r-- 1 root root  48909 Sep 18  2016 TIInit_7.2.31.bts

-rw-r--r-- 1 root root 194180 Apr 25  2016 wl1251-fw.bin

-rw-r--r-- 1 root root    752 Apr 25  2016 wl1251-nvs.bin

-rw-r--r-- 1 root root 273880 Sep 18  2016 wl1271-fw-2.bin

-rw-r--r-- 1 root root 272836 Sep 18  2016 wl1271-fw-ap.bin

-rw-r--r-- 1 root root 271832 Sep 18  2016 wl1271-fw.bin

lrwxrwxrwx 1 root root     14 Jul 21  2016 wl1271-nvs.bin -> wl127x-nvs.bin

-rw-r--r-- 1 root root 280388 Sep 18  2016 wl127x-fw-3.bin

-rw-r--r-- 1 root root 260852 Apr 25  2016 wl127x-fw-4-mr.bin

-rw-r--r-- 1 root root 261892 Apr 25  2016 wl127x-fw-4-plt.bin

-rw-r--r-- 1 root root 276684 Apr 25  2016 wl127x-fw-4-sr.bin

-rw-r--r-- 1 root root 354600 Apr 25  2016 wl127x-fw-5-mr.bin

-rw-r--r-- 1 root root 352588 Apr 25  2016 wl127x-fw-5-plt.bin

-rw-r--r-- 1 root root 370996 Apr 25  2016 wl127x-fw-5-sr.bin

-rw-r--r-- 1 root root 267496 Sep 18  2016 wl127x-fw-plt-3.bin

-rw-r--r-- 1 root root    912 Jul 21  2016 wl127x-nvs.bin

-rw-r--r-- 1 root root 284784 Sep 18  2016 wl128x-fw-3.bin

-rw-r--r-- 1 root root 264904 Apr 25  2016 wl128x-fw-4-mr.bin

-rw-r--r-- 1 root root 269424 Apr 25  2016 wl128x-fw-4-plt.bin

-rw-r--r-- 1 root root 284156 Apr 25  2016 wl128x-fw-4-sr.bin

-rw-r--r-- 1 root root 359140 Apr 25  2016 wl128x-fw-5-mr.bin

-rw-r--r-- 1 root root 360452 Apr 25  2016 wl128x-fw-5-plt.bin

-rw-r--r-- 1 root root 378988 Apr 25  2016 wl128x-fw-5-sr.bin

-rw-r--r-- 1 root root 265460 Sep 18  2016 wl128x-fw-ap.bin

-rw-r--r-- 1 root root 273324 Sep 18  2016 wl128x-fw.bin

-rw-r--r-- 1 root root 271932 Sep 18  2016 wl128x-fw-plt-3.bin

-rw-r--r-- 1 root root   1113 Jul 21  2016 wl128x-nvs.bin

lrwxrwxrwx 1 root root     14 Jul 21  2016 wl12xx-nvs.bin -> wl127x-nvs.bin

-rw-r--r-- 1 root root 639276 Apr 25  2016 wl18xx-fw-2.bin

-rw-r--r-- 1 root root 673328 Apr 25  2016 wl18xx-fw-3.bin

-rw-r--r-- 1 root root 745228 Dec 31  2016 wl18xx-fw-4.bin

-rw-r--r-- 1 root root 413860 Sep 18  2016 wl18xx-fw.bin




우선 interface 파일을 확인해보았다.


root@arm:~# ls -l /etc/network/interfaces

-rw-r--r-- 1 root root 261 Feb 11 16:32 /etc/network/interfaces

root@arm:~# cat /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Include files from /etc/network/interfaces.d:

source-directory /etc/network/interfaces.d


auto lo

iface lo inet loopback




'lo' 인터페이스에 대해서만 설정되고 있는 것이 보인다.

이 파일을 열고 eth0와 wlan0에 대한 내용을 추가했다.


root@arm:~# cat /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)

# Include files from /etc/network/interfaces.d:

source-directory /etc/network/interfaces.d


auto lo

iface lo inet loopback


allow-hotplug eth0

iface eth0 inet manual


allow-hotplug wlan0

iface wlan0 inet dhcp




재부팅을 한 후 ifconfig로 확인해보면 아래와 같이 추가된 인터페이스를 확인 할 수 있다.


root@arm:~# ifconfig

eth0      Link encap:Ethernet  HWaddr 8e:16:3e:3d:2b:e5

          UP BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


lo        Link encap:Local Loopback

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


wlan0     Link encap:Ethernet  HWaddr de:ad:be:ef:00:00

          UP BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)



작업하면서 시행착오를 겪은 부분이 있는데,

allow-hotplug가 아닌 auto eth0, auto wlan0 로 추가를 했더니, 부팅과정에서 커널 로드 후 systemd가 각 service 파일을 차례로 시작하다가 interface up하는 부분에서 무한 대기상태로 빠지는 것이었다.


문득, interface up을 담당하는 service가 어떤건지 궁금해졌다.
현재 판다보드에서 동작중인 리눅스는 ubuntu 16.04 이다.
정확하게 어떤 버전부터인지는 모르겠으나 ubuntu 16.04는 기존의 init.d script를 systemd로 대체한 것으로 보인다.

root@arm:~# ls -l /sbin/init
lrwxrwxrwx 1 root root 20 Sep  7  2016 /sbin/init -> /lib/systemd/systemd


systemd에 대한 자세한 내용은 다른 포스팅에서 다루어 보고자 한다.
일단, systemd는 커맨드라인에서 인터페이스 툴을 제공해 주고 있는데, 그 이름은 'systemctl' 이다.
이 툴을 사용해서 networking service 에 대한 정보를 확인해보았다.

root@arm:~# systemctl cat networking
# /lib/systemd/system/networking.service
[Unit]
Description=Raise network interfaces
Documentation=man:interfaces(5)
DefaultDependencies=no
Wants=network.target
After=local-fs.target network-pre.target apparmor.service systemd-sysctl.service
Before=network.target shutdown.target network-online.target
Conflicts=shutdown.target

[Install]
WantedBy=multi-user.target
WantedBy=network-online.target

[Service]
Type=oneshot
EnvironmentFile=-/etc/default/networking
ExecStartPre=-/bin/sh -c '[ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery
ExecStart=/sbin/ifup -a --read-environment
ExecStop=/sbin/ifdown -a --read-environment
RemainAfterExit=true
TimeoutStartSec=5min

# /run/systemd/generator/networking.service.d/50-insserv.conf-$network.conf
# Automatically generated by systemd-insserv-generator

[Unit]
Wants=network.target
Before=network.target


systemctl cat 은 각 service unit의 동작방식을 정의한 파일의 내용을 보여주는 명령이다.

간단히 설명 부분만 확인해보면, 'Raise network interfaces' , 찾았다 요놈.

네트워크 인터페이스를 올려주는 놈이란다.

내가 찾던 놈이구만.


Type=oneshot 인 걸로 봐서, 부팅될 때 한번만 실행 하고 끝내는 놈이지 싶다.

확인해봐야지.

networking service상태에 대해 살펴보자.


root@arm:~# systemctl status networking

● networking.service - Raise network interfaces

   Loaded: loaded (/lib/systemd/system/networking.service; enabled; vendor prese

  Drop-In: /run/systemd/generator/networking.service.d

           └─50-insserv.conf-$network.conf

   Active: active (exited) since Thu 2016-02-11 16:28:07 UTC; 27min ago

     Docs: man:interfaces(5)

  Process: 284 ExecStart=/sbin/ifup -a --read-environment (code=exited, status=0

  Process: 262 ExecStartPre=/bin/sh -c [ "$CONFIGURE_INTERFACES" != "no" ] && [

 Main PID: 284 (code=exited, status=0/SUCCESS)

   CGroup: /system.slice/networking.service


Feb 11 16:28:05 arm systemd[1]: Starting Raise network interfaces...

Feb 11 16:28:07 arm systemd[1]: Started Raise network interfaces.


자세히는 모르겠지만, 대충 살펴보면, load 되었고, active 상태인데, exited 상태이기도 하다.

그 아래를 보면, 284 PID를 갖는 process로 /sbin/ifup 을 실행 했던 것으로 보인다.

argument로 --read-environment 라는게 있는 걸로 보아, 뭔가 환경변수나 환경설정을 읽어서 interface up 을 했을 것으로 추정된다.


좋아, 다시 보자.

'systemctl cat networking' 을 통해 확인 했던 부분중에,

EnvironmentFile=-/etc/default/networking 라는 부분이 있는 것을 발견했다.


root@arm:~# cat /etc/default/networking

# Configuration for networking init script being run during

# the boot sequence


# Set to 'no' to skip interfaces configuration on boot

#CONFIGURE_INTERFACES=yes


# Don't configure these interfaces. Shell wildcards supported/

#EXCLUDE_INTERFACES=


# Set to 'yes' to enable additional verbosity

#VERBOSE=no


별다른 내용은 없는데, 주석들을 읽어보면, boot sequence 동안에 실행되는 networking init script의 설정파일쯤 되는놈인것 같다.

그런데 죄다 주석처리되어서, 딱히 하는 일은 없는 것으로 보인다.

OK. 이놈은 통과..


현재 내가 궁금한 것은 '/etc/network/interfaces' 이놈을 누가 읽는가 하는 부분인데.

ifup이 읽는 default 파일인 것으로 추정된다.. 

ifup --help 로 확인해보면 아래와 같다.


root@arm:/lib/systemd/system# ifup --help

Usage: ifup <options> <ifaces...>


Options:

        -h, --help             this help

        -V, --version          copyright and version information

        -a, --all              process all interfaces marked "auto"

        --allow CLASS          ignore non-"allow-CLASS" interfaces

        -i, --interfaces FILE  use FILE for interface definitions

        -X, --exclude PATTERN  exclude interfaces from the list of

                               interfaces to operate on by a PATTERN

        -n, --no-act           print out what would happen, but don't do it

                               (note that this option doesn't disable mappings)

        -v, --verbose          print out what would happen before doing it

        -o OPTION=VALUE        set OPTION to VALUE as though it were in

                               /etc/network/interfaces

        --no-mappings          don't run any mappings

        --no-scripts           don't run any hook scripts

        --no-loopback          don't act specially on the loopback device

        --force                force de/configuration

        --ignore-errors        ignore errors


-a 옵션은 'auto' 로 표시된 모든 인터페이스를 처리한다는 옵션이다.

--read-environment 라는 옵션은 없다.


또한 설명에 /etc/network/interfaces 에 대한 내용이 있는 걸로 미루어 봐서, interface 정의 하는 default 파일경로인 것 같다.


Next Action Item

이제 해보려는 작업은 두가지다.

1. eth0 에 '192.168.1.1' 이라는 ip를 boot argument로 설정되도록 하는 작업 ( 바로가기 )

2. wlan0 와 연동해서 Wi-Fi stack (wpa-supplicant)을 booting time에 실행되도록 하는 작업



이 댓글을 비밀 댓글로

Kernel command line 보는 방법

by Blogger 하얀쿠아
2017. 1. 5. 01:44 소프트웨어 Note/Embedded Linux

Linux kernel command line, boot argument


동작중인 kernel의 shell상에서 command line parameter를 보는 방법은 아래와 같다.

이를 'boot arguments' 라고도 한다.


$ cat /proc/cmdline


여기에는 linux kernel이 부팅할 때 필요한 여러가지 정보들을 kernel에게 넘겨주는 형태로 사용한다.

예를들면 root device나 network configuration등에 대한 정보들 말이다.


boot loader에서 linux kernel로 변수정보 넘기기

boot loader에서 linux kernel로 정보를 넘길때도 사용할 수 있다.

U-boot 에서는 'bootargs' 라는 변수의 값을 자동으로 linux kernel 부팅시키면서 넘긴다.

U-boot command line에서 아래와 같이 환경변수를 선언하면, bootargs 뒤의 'root=/dev/ram rw' 가 bootargs의 내용이 되며, 이 값이 kernel로 전달된다.


setenv bootargs root=/dev/ram rw


참고로 U-boot 는 Hush shell을 사용한다. (bourne shell과 유사함)


참고 : http://www.denx.de/wiki/DULG/LinuxKernelArgs

이 댓글을 비밀 댓글로

[네트워크/프로토콜] BOOTP 에 대해서. BOOTP란? BOOTP 특성?

by Blogger 하얀쿠아
2016. 12. 30. 02:19 소프트웨어 Note/Embedded Linux

BOOTP란? (bootstrap protocol)


Bootp는 TCP/IP상에서 자동 부팅을 위한 최초의 표준프로토콜이다.

디스크 장치가 없는 클라이언트를 구동시키기 위한 목적으로 개발되었다.

여기서, 디스크 장치가 없는 클라이언트라고 하면, 과거 Unix머신과 연결해서 사용하던 'X터미널' 과 같은 장비쯤 되시겠다.

이 터미널 장비는 디스크 장치가 없으므로, 장치의 설정정보를 저장할 곳이 마땅치 않게된다. 


그러니깐, 디스크 장치를 가지고 있는 Main Unix머신이 이 정보를 가지고 있다가, X터미널이 실행되고 Unix머신에게 연결하려고 신호를 보내면, Unix머신은 Bootp 서버를 이용해서 X터미널에게 이런 정보들을 알려주게 된다.

그러면 X터미널은 BOOTP클라이언트 쯤이 된다.

정확하게 말하면 클라이언트는(X터미널) BOOTP를 통해 3가지 정보를 제공받는다.


  1. IP주소
  2. 부트 파일이 있는 서버 이름
  3. 부트 파일 이름

하위 프로토콜로 UDP와 IP 프로토콜을 사용한다.


사실 BOOTP는 지금은 거의 사용되지 않는 구형 프로토콜이긴 하다.

이후 좀더 진보된 네트워크 관리 프로토콜이 DHCP의 기반이 된다.

게다가, BOOTP - DHCP가 완벽호환 되는 특징이 있어서,  BOOTP 클라이언트가 DHCP 서버와 통신이 가능하다.


만약 당신이 DHCP를 들어본적이 없다면, 당장은 간단히 설명하겠다.

DHCP는 '내가 누구?, 여긴 어디?' 에 대한 정보를 주는 프로토콜 쯤으로 이해해두자. 

즉, IP address, subnet mask address, DNS address, gateway address 와 같은 네트워크 그룹에 가입하기 위해 필요한 정보나, domain상에서 통용되는 터미널의 이름 등..을 전달해 준다고 보면 된다.


임베디드 개발보드에서는 tftp와 함께 사용되곤 한다.

즉, Bootloader에서 Kernel과 파일시스템 Image를 Host PC에서 Target board로 다운로드할 때, Host PC에 연결하기 위한 정보가 필요한데,

Bootp를 이용하면 Target board의 IP와 Host에 대한 정보를 Host PC에서 가져올 수 있도록 하는게 가능하다.



BOOTP 특성

몇가지 특성을 알면, BOOTP를 깊게 이해하는데 좀 더 수월할 것이다.


BOOTP는 클라이언트 - 서버 구조로 동작한다.


그리고 정적인 주소 설정 방식을 사용한다.

여기서 '정적인 주소 설정 방식' 이 무엇이냐면, 관리자에 의해 미리 정의되어있는 '물리주소 - IP주소' 간 매핑 테이블을 사용하는 방식이라고 생각하면된다.


또한 UDP에 의해 캡슐화 되고, 보통 TFTP와 함께 동작한다.

클라이언트 요청은 UDP 포트 68로 전달되고, 서버 응답은 UDP 포트 67로 전달된다.

요청메세지는 브로드캐스트로 전송되며, Source IP Address는 0.0.0.0 , Destination IP Address는 255.255.255.255 로 설정한다.


UDP로 전달되는 메세지 유실에 대한 대비책으로써, 재전송(Retransmission)과 시간초과(Timeout) 정책을 이용한다.

주소 설정 방식과, 재전송 등에 대해서는 아래 세부섹션에서 좀더 살펴보자.




BOOTP 의 RFC document

만약, 당신이 굉장히 네트워크에 관심이 많은 사람이어서, 

BOOTP에 대해 자세히 알고 싶다면 RFC 951와 RFC 1542를 참고하기 바란다.


일반적으로 RFC문서는 아래 주소에서 찾을 수 있다.


RFC문서 검색기 페이지 : https://www.rfc-editor.org/search/rfc_search.php




귀찮다면, 아래를 다운받자.


RFC 951 -- The Bootstrap Protocol (BOOTP) (ftp://nic.ddn.mil/rfc/rfc951.txt)

rfc951.txt


RFC 1542 Clarifications and Extensions for the Bootstrap ProtocolClarifications and Extensions for the Bootstrap Protocol

rfc1542.txt




또한, IETF라는 기구가 있다. '국제 인터넷 표준화 기구' 쯤으로 해석한다.

IETF는 Internet Engineering Task Force의 머릿글자이다.

이는 인터넷의 운영, 관리, 개발에 대해 협의하고 프로토콜과 구조적인 사안들을 분석하는 인터넷 표준화 작업기구이다.

계속 관심이 간다면, 아래 홈페이지에서 rfc에 대한 몇몇 정보를 찾아보자.


IETF Homepage : http://www.ietf.org/rfc.html






Tftp 란


TFTP (Trivial File Transfer Protocol) 은 FTP와 같은 파일 전송 프로토콜이다.

하위 프로토콜로 IP, UDP프로토콜을 사용한다.

개발보드에서는 Bootloader에서 Kernel과 파일시스템 Image를 Host에서 Target으로 이더넷을 통하여 고속으로 다운로드하기 위해 사용한다.



Bootp와 Tftp를 활용한 개발보드의 초기 부팅방법


구체적인 활용 방법에 대해서는 기회가 된다면 내용을 추가하도록 하겠다.




이 댓글을 비밀 댓글로
    • 지나가던
    • 2019.11.21 12:35
    진정으로 저에게 도움되는 글 입니다. 감사합니다.

PandaBoard ES : 부팅용 SD card 준비

by Blogger 하얀쿠아
2016. 12. 16. 00:50 소프트웨어 Note/Embedded Linux

PandaBoard ES : 보드 부팅을 위한 SD card 준비


TI 의 ARM Cortex A9 기반의 임베디드 보드인 PandaBoard ES에는 내장된 별도의 저장공간이 없다.

대신에 sd card슬롯을 제공하고, sd카드의 boot partition을 통해 부팅을 하게된다.

아무래도 trial(시험용) 보드 성격이 강해서 그런 것이리라..


우선 판다보드 부팅에 사용할 sd카드를 준비하는 작업이 필요하다.

다음 순서로 진행할 것이다.


1. SD카드 파티션 분할 및 각 파티션 포맷

2. U-Boot 소스코드 다운로드 및 빌드

3. Linux Kernel 소스코드 다운로드 및 빌드

4. Ubuntu의 Root File System 확보 및 SD카드에 복사

5. Wi-Fi driver firmware 확보 및 SD카드에 복사

6. /etc/fstab를 통해 각 파티션을 자동마운트 되도록 수정



파티션 구성


아래와 같이 4개의 파티션으로 구성했다.

16GB SD카드를 우분투로 동작중인 host pc에 꽂으니 /dev/sdc 로 인식되었다.

이를 sdc1 ~ sdc4 까지 4개의 파티션으로 나누었다.


이 부분은 각자의 환경에 따라 다르게 인식될 수 있다.

즉, /dev/sdb가 될 수도 있고... /dev/sdd가 될 수도 있으며.. /dev/mmcblk0 이런식이 될 수도 있다.



Command (m for help): p
Disk /dev/sdc: 14.7 GiB, 15719727104 bytes, 30702592 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6114984e

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sdc1  *        2048  2099199  2097152    1G  c W95 FAT32 (LBA)
/dev/sdc2        2099200 23070719 20971520   10G 83 Linux
/dev/sdc3       23070720 27265023  4194304    2G 83 Linux
/dev/sdc4       27265024 30702591  3437568  1.7G 82 Linux swap / Solaris


sdc1는 부팅 파티션으로, u-boot.img와 MLO를 넣고, boot flag를 true로 했다.

filesystem type은 FAT32 (LBA)로 하였다.


sdc2는 리눅스를 위한 root 파티션으로, 10GB를 할당했고, filesystem type은 ext4로 했다.

sdc3은 리눅스의 /var 디렉토리를 위한 파티션으로, 2GB를 할당했다. filesystem type은 ext4로 했다.

sdc4는 리눅스의 swap 파티션으로 남은 공간 전체를 할당했다.


파티션 포맷 (Format Partition)


나누어둔 파티션을 실제로 사용하기 위해서는 각각의 파티션을 포맷해야 한다.


jeon@ubuntu:~$ sudo mkfs.vfat -F 32 -n boot /dev/sdc1
[sudo] password for jeon:
mkfs.fat 3.0.28 (2015-05-16)
mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows


jeon@ubuntu:~$ sudo mkfs.ext4 -L rootfs /dev/sdc2
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 1257cd67-576f-47f8-a55b-d2c8c2a81539
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                           
Writing inode tables: done                           
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done


jeon@ubuntu:~$ sudo mkfs.ext4 -L data /dev/sdc3
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 524288 4k blocks and 131072 inodes
Filesystem UUID: c38ba4aa-a430-4d3f-b5ca-d5edce08379f
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912

Allocating group tables: done                           
Writing inode tables: done                           
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done


jeon@ubuntu:~$ sudo mkswap -c -L swap /dev/sdc4
0 bad pages
Setting up swapspace version 1, size = 1.7 GiB (1760030720 bytes)
LABEL=swap, UUID=fa0383da-57ed-4a06-8e9a-e4a4a3659b85



커널 소스 확보 및 빌드


Pandaboard ES에서 사용할 커널이미지를 만들기 위해서, 직접 커널 소스를 빌드하기로 했다.

최대한 그런 일은 없어야 겠지만, 커널 수정이 필요할 경우가 발생하면... 수정의 용이성을 위해서이다.

만약 미리 빌드된 커널이미지를 보드에 올려서 사용한다면, 커널 수정이 필요한 순간, 일치하는 커널 소스를 찾고 빌드환경 만들고... 좀 번거로울 것이기 때문에.

처음부터 미리 번거롭기로 했다.(?)


CPU architecture 별로 커널 빌드를 위한 스크립트를 제공하는 고마운 git 저장소가 있다.



https://github.com/RobertCNelson/armv7-multiplatform/tree/v4.9.x



/dev/sdc2로 root file system 복사

ubuntu 16.04 LTS의 file system을 구해서 2번째 파티션 (리눅스의 root파티션)에 복사해 넣었다.

리눅스의 커널이미지와는 별개로, 우리는 리눅스 배포판의 root file system이 필요하다.

왜 이런 작업이 필요하나면...

커널이미지는 말그대로 커널부분만을 제공한다.

다시말하면 /usr/bin/ 에 존재하는 실행파일들... 즉 여러가지 커맨드들을 사용한다거나..

/etc 아래 존재하는 리눅스의 설정파일등을 통해 리눅스 설정을 한다거나...

systemd등을 통해 부팅시점에 여러가지 데몬들을 띄우거나 소켓을 생성하거나 ... 등등의 작업들은 커널이미지가 제공하지 않는다는 것이다.

이걸 일일히 코드를 구해서, 크로스컴파일 하고... directory 를 구조에 맞게 만들고... 직접하려면 번거로울 것 이다. 물론 한번 해보면 좋은 경험은 되겠지.


이런 것을 제공하기 위해 누군가가 미리 만들어둔 linux root file system을 구해다가 단순히 sd카드에 복사해 넣는 것으로 끝이다.



다운로드

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz



파일 검증

sha256sum ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz
2883cdd3416e0bd5988aa351c88db72ca089a184c5a670662d750568ca0869d8  ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz


압축해제

tar xf ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz


참고로 이 ubuntu의 계정은 'ubuntu'이고 암호는 'temppwd' 이다.



root file 복사하기

sudo mount /dev/sdc2 /media/rootfs
sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/



파일시스템 테이블 (/etc/fstab)


이 작업을 해두어야, 부팅시 자동으로 마운트가 된다.

/media/rootfs//etc/fstab 는 처음에 아무런 내용이 없이 주석이 달린 1줄만 있다.

나는 4개의 파티션으로 나누었으므로 아래와 같이 mount point및 mount option등을 지정해 주었다.

만약 fstab에 대해 익숙하지 않다면, 이에 대해 알아볼 것은 권한다.

내용은 많지 않으나, 여기서는 자세히 다루지 않겠다.


jeon@ubuntu:/media/jeon/rootfs$ cat etc/fstab
# UNCONFIGURED FSTAB FOR BASE SYSTEM
/dev/mmcblk0p1  /boot  vfat  errors=remount-ro  0  0
/dev/mmcblk0p2  /  ext4  errors=remount-ro  0  1
/dev/mmcblk0p3  /var  ext4  auto  0  0
/dev/mmcblk0p4  none  swap  sw  0  0


간략히 알아보면, fstab은 총 6개의 부분으로 나누어져 있다.

첫번째는 File System Device Name, 두번째는 Mount Point, 세번째는 FileSystem Type, 네번째는 Mount Option, 다섯번째와 여섯번째 숫자의 의미는 각각 Dump할지 말지여부와 File Sequence Check Option값 이다.



이 댓글을 비밀 댓글로

풀업 저항, 풀다운 저항 (Pull-up, Pull-down)

by Blogger 하얀쿠아
2016. 12. 16. 00:28 하드웨어 Note/Basis Circuit

풀업 저항, 풀다운 저항 (Pull-up, Pull-down) - 입력단 회로

MCU나 임베디드 시스템을 구성할 때, 입력부분을 설계해야 하는 경우가 있다. 여기서 입력 부분이라 하면, 버튼이나 스위치 같은 물리적인 입력이 발생하는 부분을 말한다. 이때, 풀업 (Pull-up) 저항을 달거나 풀다운(Pull-down) 저항을 달게 된다.


왜 그런지 이유를 알아보자. 이 저항이 무슨 목적을 가지고 있는지를 이해하면 된다.

그리고 더 나아가, 이 저항을 얼마짜리를 달아야 하는지, 저항값 계산 방법을 알아보자.





플로팅 상태

풀업 / 풀다운이 왜 필요한지를 이해하려면 먼저 플로팅(Floating) 상태라는 것을 알면 쉽다.

플로팅은 '떠있다, 부유하는, 유동적인' 등의 뜻이다. 

디지털회로에서 플로팅 상태 라고하면, '알수없는 상태' 라고 이해하면 된다.


좀더 쉽게 설명해보자. 아두이노, AVR Atmega, Cortex-M3, 라즈베리파이 등등... MCU좀 다뤄봤다 싶은 분이라면 GPIO 핀을 떠올려 보자.

정상적인 상황이라면 어떤 GPIO핀을 딱 잡고, '너 무슨상태야?' 했을 때, '0(Low)이야' 아니면 '1(High) 이야'이라고 대답해야 한다.


그런데, '나... 잘 모르겠는데?' 라고 대답하는 녀석. 이녀석이 바로 플로팅 상태이다.

어리버리한 녀석.


왜 이런 녀석이 등장하느냐? 

전원 5V를 인가하는 MCU를 가정해보자.

0V~0.8V 쯤은 Low로 하고, 2.8V~5V 쯤은 High로 하는 MCU라고 가정해보자.

그러면 0.8V 초과 ~ 2.8V 미만의 애매한 전압이 핀에 들어가면? 이 MCU는 그 핀을 플로팅 상태라고 인식하게 될 것이다.


입력단에 풀업 저항이나, 풀다운 저항을 두지 않는다면, 이런 플로팅 상태를 겪게 될지도 모른다.


그리고 들어가기에 앞서 일단 기억할 것이 있다. 

왜 이렇게 기억할게 많냐? 라고 생각하지 말고 기억하자. 피가되고 살이된다. 몸매관리때문에 살찌기 싫으면 까먹던지.


1. 지금 설명하는 풀업 저항, 풀다운 저항은 모두 입력단 회로에 대한 것이다.

2. 입력 스위치가 OFF 일 때, 플로되는 걸 막는게 목적이다.

3. 이름에서 풍기는 스멜을 느끼자.

4. 풀업은 '스위치가 OFF일때 플로팅에 빠져 허우적 거리는 어리버리한 녀석을 High 상태로 끌어올리는(Pull-up) 저항이다.

5. 반대로, 풀다운은 '스위치가 OFF일때 플로팅에 빠져 허우적 거리는 어리버리한 녀석을 Low 상태로 끌어내리는(Pull-down) 저항이다.


오케이. 시작하자.


1. 풀업(pull-up) 저항

논리적으로 H-레벨 상태를 유지하기 위해 신호의 입력/출력 단자와 전원(Vcc) 단자 사이에 접속하는 저항


 Switch

 ON

 OFF

 (a) 그림

 0V (Low)

 Floating 

 (b) 그림

 0V (Low) 

 +5V (High) 



그림1의 Logic은 입력을 low로 만들어놓은 그림이다. 

여기서(a)와 (b)의 차이가 바로 풀업 저항의 의미가 된다.


일단, (a) 그림을 보자.

스위치가 ON되면 전원으로부터 접지라인까지 바로 연결이 되니까 이 Logic은 Low가 인가가 된다.

그런데 스위치가 OFF 될 경우는 어떠한가? 입력 상태가 어떤 상태인지 알 수가 없다. 

당장은 High로 보일 수 있지만, 정전기라던지, 전압에 순간적인 변화가 생기면 Low로 바뀔 수도 있는 애매한 상황이다. 이런 경우를 floating 되어있다고 한다. 

floating 상태에서는 입력 레벨이 어떤지 알 수 없기 때문에(즉, Low일수도 있고 High일수도 있고 왔다갔다 할수도 있고...) Logic Device가 동작하는데 문제가 생길 수 있다.

왜냐하면 알 수 없는 입력이 들어왔기 때문에 알 수 없는 결과값이 나오게 되기 때문이다.

이런 floating 되어 있는 입력 상태를 없애주고자 고안된 것이 바로 풀업 저항(Pull-up)이다.

풀업 저항의 주 목적은 바로 스위치가 OFF 될 때가 된다. 


이 풀업 저항을 이해하려면 (b) 그림을 유심히 살펴보자.


(b)그림을 보면 (a)그림과는 다르게 풀업 저항을 통해서 디지털 회로가 전원 +5V로 연결이 되어 있기 때문에 스위치가 OFF되더라도 입력값의 혼동이 없다. 즉, 스위치가 OFF되면 High 상태가 된다. 이른바 알려진 입력 상태가 되는 것이다.

스위치가 ON되면 Low 상태가 된다. 버튼이 GND와 연결되어 있어서, 전원으로부터 전류가 디지털 회로로 가지않고 모두 버튼쪽으로 흘러가게 되기 때문이다.


그리고 풀업 저항이 없으면 스위칭 시 과도한 전류가 흐를 개연성이 많기 때문에, 디바이스의 회로에 안 좋은 영향을 끼칠 수가 있다. 

이런 문제도 풀업(또는 풀다운)저항으로 해결할 수가 있다.




2. 풀다운(pull-down) 저항

스위치가 OFF될 때, 논리적으로 Low레벨 상태를 유지하기 위해 신호의 입력/출력 단자와 접지 단자 사이에 접속하는 저항

풀 다운은 풀업과는 반대로 연결되어 있다.

즉, 스위치와 저항의 위치가 풀업과는 다르게 바뀌어 있다.

그래서 스위치가 OFF되면 Low 상태가 되고, 스위치가 ON되면 High 상태가 된다. 일반적으로 MCU의 입력부분에는 저항이 달려있는데, 풀업, 풀다운 저항보다 아주 아주 큰값이므로 전압분배 법칙에 의해 대부분의 전압이 MCU의 입력부분으로 흘러 High 상태가 된다.




 Switch

 ON

 OFF

 (a) 그림

 +5V (High)

 Floating 

 (b) 그림

 +5V (High) 

 0V (Low) 



저항의 크기 계산

이러한 스위치 입력회로에서 만약 풀업 저항이나 풀다운 저항을 사용하지 않고 직접 +5V 또는 GND 단자에 스위치를 접속하면?

스위치를 눌렀을 때 그대로 단락되어 과전류가 흐르게 될 것이다.


그러므로 저항의 크기를 결정할 때는 입력신호와 관련되기 보다는 스위치를 눌렀을 때 형성되는 폐회로에 흐르는 전류의 크기를 감안하여 결정하면 된다. 일반적으로 이 전류의 크기는 수 mA가 되도록 하며, 따라서 보통 수 KΩ 정도의 저항을 사용하면 된다.


정리

일반적으로 풀다운 보다는 풀업이 노이즈에 강하다.

그래서 풀업을 더 많이 사용한다.


그리고 TTL과 같은 디지털 논리소자는 구조적으로 입력신호가 플로팅 상태이면, H상태와 같이 동작하도록 설계 되어 있다. 하지만 실제로 회로를 이렇게 사용하면 잡음에 매우 취약해지는 등의 부작용으로 회로시스템이 불안정해진다.


이 댓글을 비밀 댓글로

라즈베리파이 스마트 조명 (Pi-Light: Raspberry Pi Powered Smart Light)

by Blogger 하얀쿠아
2016. 11. 26. 15:20 하드웨어 Note/라즈베리파이

라즈베리파이 스마트 조명 (Pi-Light: Raspberry Pi Powered Smart Light)



이 프로젝트를 위한 github : https://github.com/JamesPoole/PiLight



출처 : http://jamespoole.me/2016/10/11/pilight-raspberry-pi-powered-smart-light/

이 댓글을 비밀 댓글로

라즈베리파이 보안카메라 (Raspberry Pi Security Camera)

by Blogger 하얀쿠아
2016. 11. 26. 15:18 하드웨어 Note/라즈베리파이

라즈베리파이 보안카메라 (Raspberry Pi Security Camera)



소개

Welcome to the official tutorial for building your very own Particle-connected security camera with Raspberry Pi! This project uses the Raspberry Pi integration with the Particle Cloud to control a PIR sensor, Neopixel LED ring, and Raspberry Pi camera to watch for intruders, snap a photo, and upload it to the web via Dropbox.

All firmware and software files for the project are located at the following GitHub repository: https://github.com/spark/particle-pi-camera




출처 : https://docs.particle.io/tutorials/projects/particle-pi-security-camera/

이 댓글을 비밀 댓글로

[안드로이드] 최신 Android 7.0 "누가" 출시 : 안드로이드 앱 개발자가 알아둬야 할 것들

by Blogger 하얀쿠아
2016. 9. 23. 01:07 소프트웨어 Note/Android

최신 Android 7.0 "누가" 출시 : 안드로이드 앱 개발자가 알아둬야 할 것들



안드로이드 7.0, "누가" (Android Nougat) 버전 출시되면서 Google은 이 새로운 운영 체제에 몇 가지 필수 기능을 추가했다. 

사실 안드로이드 7.0 누가(Android nougat)에서는 안드로이드 6.0 과 비교했을때, UI, UX, 그리고 Look and Feel을 크게 변경하지는 않았다.

그러나 Google은 몇 가지 새로운 필수 기능을 추가했고,  운영 체제를 좀더 세련되게 다듬었다고 볼 수 있다.


Nougat에 대한 Google의 설명은 다음과 같다.


"Android Nougat은 보안적인 측면에서 사용자를 더욱 안전하게 유지하는 데 중요한 요소를 추가했다. chromebook의 업데이트 적용에 영감을 받아 우리는 긴밀하고도 사용자가 크게 신경쓰지 않아도 되는 방식(seamless)의 업데이트를 도입했다. 그래서 Nougat에 내장 된 새로운 안드로이드 장치는 백그라운드에서 시스템 업데이트를 설치할 수 있다. 즉, 이것의 의미는 업데이트가 백그라운드에서 진행되고, 사용자는 그것을 굳이 인지하지 않은채 사용하다가, 사용자가 다음에 장치를 재부팅하게 되면, 새 장치가 자동으로 새롭게 업데이트 시스템 이미지로 전환된다. "


재빨리 추가된 기능을 훑어보자.


Android Nougat에 추가 된 기능


멀티 윈도우 멀티 태스킹


 멀티 태스킹 윈도우를 제공한다. 때때로 우리는 일을하기 위해 두 가지 앱을 열었지만 동시에 볼 수는 없었다. 그래서 우리의 작업을 쉽게하기 위해 Google은 Nougat에서 이 기능을 추가했다.

이제 한 화면에 두 개의 앱을 함께 열 수 있다. 화면은 기본적으로 50:50으로 분할된다. 또한 휴대 전화의 상단 및 하단, 왼쪽 또는 오른쪽으로 앱을 쉽게 가져올 수 있다. 


사실, 이 기능은 이미 삼성 안드로이드에서는 오래전부터 지원했던 기능이다. 갤럭시 테블릿이나, 갤럭시 노트 시리즈에서 2014년 무렵부터 지원하던 기능이다. 구글은 이제서야 공식 안드로이드에 이 기능을 넣은 것이다.


휴대 전화를 더 빠르게 사용한다고 느끼게 하면서도 배터리 사용량은 줄인다. Android Nougat는 메모리 관리가 더 좋으며 배터리 사용량도 적다.

잠시 휴대 전화의 화면이 꺼지면 항상 백그라운드에서 작업을 중단한다.




더 나은 알림


Android Nougat에서는 전체 애플리케이션을 열지 않고도 트레이에서 알림을 회신 할 수 있다.

사실 이것도 삼성 안드로이드는 오래전부터 지원하던 내용이다.




적은 모바일 데이터 사용 


백그라운드에서 실행중인 응용 프로그램은 모바일 데이터를 불필요하게 사용하는 경우가 있다. 새로운 데이터 세이버 설정은 모바일 데이터를 저장하는 데 도움이 될 수 있다. 이를 통해 임의의 데이터 사용을 차단하고 트윗이나 이메일에 대한 것들을 제한 할 수 있다. 이렇게하면 모바일 데이터 사용을 줄일 수 있다. 만약 사용자가 이 기능이 활성화되지 않기를 원한다면, 기능을 비활성화 할 수 있다. 그리고 이것이 활성화되면 알림 메시지에 아이콘이 생기고 무슨 일이 일어나는지 알려준다.



더 많은 인간 이모티콘 :


Android Nougat 버전은 1,500여 가지 이상의 이모티콘을 가지고 있다.




Android TV 녹화 및 PIP (Picture-in-Picture) 


Nougat는 시청하는 동안 예약 녹화 및 녹화 기능을 제공한다. 이것은 Android TV와 함께 제공되는 TV의 훌륭한 기능이다. 이것으로 여러 세션을 저장할 수 있다.




새로운 확대 / 축소 기능


사용자가 화면에 표시되는 새로운 확대 / 축소 방법을 얻고 텍스트 크기를 조정할 수 있다.

이 댓글을 비밀 댓글로

삼성 GearS2를 위한 타이젠 앱 개발하기 : [2] Hello world 앱 띄우기 (맥 OS X)

by Blogger 하얀쿠아
2016. 4. 6. 00:06 소프트웨어 Note/Tizen

SDK설치를 했으니, 실제로 앱을 기어S2에 올려봐야죠.


그런데요, 아이폰 앱개발이나 안드로이드폰 앱개발을 해보셨던 분이라면 의아한 부분이 있을거에요.


기어S2랑 컴퓨터랑 어떻게 연결해서 앱을 올리지?



기어S2는 컴퓨터와 USB케이블을 이용해서 직접 연결할 수 는 없는 구조입니다.

물론 기어S2 시계줄을 빼고 옆의 작은 커버를 벗기면 5핀 단자가 노출되긴 하는데요,

연결할 거치대가 별도로 제공되거나 판매되고 있지 않죠.


Tizen개발자 사이트와 삼성에서 공식적으로 언급하는 방법은 Wi-Fi를 사용하는 방법입니다.

기어S2와 컴퓨터를 동일한 네트워크에 연결한 뒤, 이 둘을 'sdb (smart debugger bridge)' 라는 툴을 이용해서 TCP/IP layer로 연결합니다.


선이 없어서 깔끔하지만 반응속도가 좀 늦다라는 단점이 있는 것 같아요. (기분 탓만은 아니겠죠. 실제로 느려요. 터미널상에서 프롬프트 떨어지는게..)


아무튼, 이번에 저는 뭘할거면요.



맥 OS X 를 사용하는 맥북에서 

Tizen SDK 2.4 를 사용하여

삼성 기어S2 에

Hello world 라는 텍스트를 보여주는 앱을 만들어 올릴겁니다.



참고로 오늘, (2016-04-05) Tizen SDK 2.4 Rev.5 가 배포되기 시작했는데요.

그 이전버전이었던 Tizen SDK 2.4 Rev.4 (맥 OS X 용)는 기어S2에 앱을 설치할 수 없었습니다. 정확히 말하면 edc를 사용하는 Native App을 올릴수가 없었어요.

빌드에러가 났기 때문인데요.


자세히 알고싶으시면 관련해서 제가 Tizen개발자 사이트 포럼에 질문 남겼던 글을 참조하시면 될 것 같아요

https://developer.tizen.org/forums/sdk-ide/os-x%EC%97%90%EC%84%9C-2.4-rev.4-sdk-%EB%A1%9C-native-app-%EB%B9%8C%EB%93%9C%EC%8B%9C-%EC%97%90%EB%9F%AC%EB%B0%9C%EC%83%9D


답글 속도도 늦고.. 

다른사람들은 된다고 답했던 방법들은 실제로 해보면 되지 않고, 

그래서 그 해결했다는 사람에게 물어봐도 답이 없고..

좀 답답하긴 했는데요,

Rev.5 로 업데이트 되면서 해결되서 아무튼 다행입니다.



각설하고,진행과정을 살펴보죠.

아래 순서로 진행할 겁니다.

쓸데없는 사설을 늘어놓는 것은 이제 그만할게요.


1. PC의 SDK에서 기어 S2 인식하도록 연결하기.

2. Samsung Developer Center에서 Certificate 발급하기

3. Native 앱 코드 구현하기

4. 앱 코드 빌드해서 패키지로 만들고, 기어 S2에 설치하기


부록. Native Application? Web Application? 뭐가 어떻게 다른거야?



1. PC와 기어 S2 연결하기

아시다시피 기어S2는 USB 케이블로 연결 할 수 있는 포트가 없습니다.


쉽게 그림으로 보면 연결방식은 아래와 같아요



Connect via Wi-Fi




찾아보니 삼성에서는 아래와 같이 연결방법을 안내해주고 있습니다.


※ In case of devices which do not support USB, like the Gear S2, they need to use Wi-Fi connection to connect to the Host PC.

  1. Connect the Host PC to the Wireless AP via UTP cable or Wi-Fi.
  2. Turn on Wi-Fi of your device.
  3. Turn on debugging mode of your device. Settings > Gear Info > Debugging
  4. Reboot the device.
  5. Connect the device to the same wireless AP.
  6. Once connected, find the IP address from the AP via DHCP. This IP address will be used during the sdb connection. You can get this IP address by checking the information of the access point the Gear S2 device is currently connected to.
  7. Open the terminal in the Host PC and use this connect command:

    $ sdb connect [Gear S2 IP address]:26101

    Ex) $ sdb connect 192.168.0.130:26101


그리고 '삼성 개발자 사이트' 에서도 연결 방법 설명을 해주고 있네요


삼성개발자 사이트 GearS2와 SDK 연결방법 : http://developer.samsung.com/technical-doc/view.do?v=T000000251&pi=1&ps=10&pb=Y&ct=CT030000&sc=



그러나 위 방법대로 해도 안되는 경우가 있을 수 있는데요, 다음을 확인해 봅니다.

 1) 설정 => 연결 => 블루투스 => OFF 인지 확인. 

 

만약 블루투스가 ON (사용함) 이면 sdb연결이 안되는 경우가 있더군요.


 2) 무선 간섭을 피하기 위해 충전기에서 GearS2를 분리하여 멀리 둬 보세요.


확인해보니 초기에 판매된 GearS2의 펌웨어는 블루투스와 Wi-Fi 모두 ON 이면 SDK에 Wi-Fi를 통한 연결이 안되는 문제가 있었다고 합니다.

* NOTE 

Bluetooth and Wi-Fi cannot be turned on at the same time on the Gear S2 with its initial firmware. However, the latest firmware fixes this issue. To turn on both Bluetooth and Wi-Fi at the same time; the Debugging mode is switched ON with the recent firmware. (Firmware for US and Japan 3G models soon will be available). To update the firmware, check the Gear Software Upgrade in the Samsung Gear application on your paired mobile device.


또한 위 a~g step 으로 나열된 방법은 terminal상에서 커맨드를 입력해서 sdb shell을 연결하는 방법이고요.

SDK IDE 환경에서는 아래 그림을 참고해서 연결하시면 됩니다.



Remote Device Manager에서 GearS2 추가하기


Tizen SDK의 Connection Explorer에 표시된 GearS2







2. Samsung Developer Center에서 Certificate 발급하기


이제 할 일은 SDK에 연결된 기어S2에 '앱설치 허용' 을 해주어야 합니다.

SDK의 'Connection Explorer' 에서 보여지는 기어S2를 오른쪽 클릭 하면 메뉴가 뜨는데,

'Permit to install applications' 를 선택합니다.



Permit to install applications


SDK로 가지고 계신 기어S2에 앱을 올리는게 처음이시라면 아래와 같은 에러창이 발생하는 걸 볼 수 있는데요,

가만히 읽어보니 Certificate를 발급받아야 한다는 얘기입니다.




Certificate?

테스트 목적으로 앱을 빌드할 때 필요한 일종의 '인증 열쇠' 입니다.

Tizen Native 앱을 테스트 목적으로 컴파일하면, 그 결과물로 'tpk' 라는 확장자를 가지는 패키지 파일이 생성되는데요,

'인증 열쇠'라고 말씀드린 Certificate에 등록한 단 1대의 기어S2 에만 설치가 가능하다고 합니다.

타이젠 개발자 사이트에서는 앱 유출 방지 목적이라고 설명하고 있네요. 



Certificate Guides

In order to install a Tizen application onto Samsung Tizen devices, you must first register certificates containing the DUID (Device Unique Identifier) of the device. Two types of certificate are needed, the author and the distributor certificate. These certificates are used for signing and verifying the application.

These certificates ensure that your signed application will run only on test devices which you registered. It guarantees that your application will not be distributed by someone else even though your application package is leaked. (테스트중인 앱의 설치패키지가 유출되어도 걱정 말라는 뉘앙스로 보입니다)

You have to take the certification steps not only for testing your apps on the actual devices but also for uploading your apps to Samsung GALAXY Apps Seller site.

The Tizen Extension SDK for Certificate provides functionalities to get and register Samsung Tizen certificates. This version 1.2 simplifies the steps on how to get and register certificates. In order to do this procedure, you must first install the Tizen SDK version 2.4 or later.



아무튼 잘은 모르겠지만 필요하다고 하니깐.

등록을 해봅시다.



SDK 상단의 툴바를 살펴 보면 Certificate 등록을 위한 버튼이 있습니다.

이때 열리는 'Samsung Tizen Certificate' 창에서 Step 1. ~ Step 4. 를 진행하시면 됩니다.


자 여기서 귀찮은 내용이 있는데요.

이때.. 필요한 것은 '삼성 계정' 입니다. 

Step 3. 에서  author certificate 등록할 때 로그인을 요구합니다.

그리고 Step 4. 에서  distributor certificate 를 등록할때도 로그인을 요구합니다.




아무튼 Step 4까지 모두 진행했으면, OK를 누르고, Registration이 진행되는 동안 잠시 기다립니다.


완료 후, 처음에 실패했던 과정을  다시 진행합니다.

Connection Explorer 에서 기어S2를 오른쪽으로 누르고 'Permit to install applications' 를 선택하면, certificate를 기어S2로 업로드 하게됩니다.

이때부터 앱을 설치 해볼 수 있지요.







3. Native 앱 코드 구현하기

구현이라고 거창하게 말했지만요,


SDK를 설치하면 기본으로 제공되는 Sample App을 그냥 SDK에 추가하고 빌드해서 GearS2에 설치해볼거에요


아래 그림대로 잘 따라와보세요.














구현(?) 완료 했습니다.

구현이라기 보다는, 이미 구현된 sample앱을 Tizen SDK에 프로젝트 형태로 추가한 거네요. 





4. 앱 코드 빌드해서 패키지로 만들고, 기어 S2에 설치하기


여기까지 하셨으면 SDK IDE의 왼쪽에 있는 Project Explorer 에 BasicUI 라는 이름의 프로젝트가 하나 생겼을 거에요.


Project 의 디렉토리 구성이나, manifest.xml 이 무슨역할을 하는지? 


궁금할 지도 모르겠네요.


대충 짐작은 가시죠?

아, 이게 뭔가 싶고 짐작도 잘 안가도 상관없어요.

지금 알아볼건 아니고, 차차 알아가도 될 것 같고요.



지금은 앱을 빌드하고, 기어S2에 설치 해볼겁니다.


프로젝트를 오른쪽으로 누르고 보이는 메뉴에서

Run As -> Tizen Native Application 


을 선택해 줍니다.




그러면 아래와 같이 'Console' 탭에 설치 과정에 대한 메세지들이 보여지는데요,


문제가 있다면 이 'Console' 의 로그를 차근차근 읽어서 문제 원인을 찾을 수 있어요. 

그리고 SDK IDE tool 이라면 당연히 그럴 수 있어야 하죠.

아니면 앱 개발자가 상당히 불편하겠죠?


아래 그림의 메세지를 읽어보면

앱 빌드가 끝난 직후의 화면인걸 알수 있습니다.


내용인 즉,

package를 만들고

package를 기어S2로 전송했고

기어S2 에서 package를 설치했다고 되어있네요.


가만 보니 패키지가 /opt/usr/apps/tmp/ 경로에

org.example.basicui-1.0.0-arm.tpk  라는 이름으로 기어S2에 저장된 것도 알수 있고요.


설치가 완료 후 자동으로 앱이 실행되기 까지 했다고 되어있네요.


간단한 샘플앱을 빌드해서 패키지를 만들고 기어에 설치하고 실행하기까지 약 41초의 시간이 걸렸습니다.

흠.. 꽤 걸리네요.


뭐 아무튼.


실행된 모습은 아래와 같아요.




basic ui 앱이 실행된 모습





부록. Native Application? Web Application? 뭐가 어떻게 다른거야?



위 과정에서 Tizen Native 앱 이라고 말했지요.

그냥 앱이라고 하지 왜 Native 앱이라고 했을까요? 

음.. 뭐 Native 앱이 아닌 다른 앱이 존재한다는 얘기겠죠.



찾아보니 Web 앱 이라는 형태가 또 있네요.

HTML5 + CSS + Javascript 로 앱을 구현하는 방식이라고 하고요.

HTML파일과 CSS로 UI를 만들고, js파일에서 Web API 라는 Javascript function 호출로 앱을 만들 수 있다고 하네요.


반면 Native앱은 C언어와 C++언어를 사용해서 만들어진 Native API를 호출하는 방식으로 앱을 만들 수 있습니다.

UI는 EFL 이라는 UI framework를 사용해서 만들수 있고요,

UI layout은 EDC라는 script언어로 잡을 수 있다고 하네요. Android의 XML로 UI layout잡는 방식과 비슷하겠죠 뭐.


마지막으로 이 둘을 혼합한 Hybrid 앱 이라는 형태가 존재합니다.

대부분의 Hybrid 라는 단어를 취하는 것들이 그렇듯,

Tizen의 Hybrid앱도 이 두 앱유형의 장점은 취하고, 단점은 제외하는 형태겠지요.

자세히 알아보는건 뒤로 미룰게요.


이해하기 쉽게 그림으로 한번 볼까요?


아래 그림은 웹앱과 네이티브앱이라는 두가지 앱 유형을 지원하고 있는 Tizen 아키텍쳐의 모습을 나타냅니다.

The following figure illustrates the Tizen architecture model supporting the 2 application types.



Tizen Architecture


tizen.org의 getting started 에서 발췌한 내용입니다.


Tizen Application Types

Tizen platform supports 2 primary application types:

  • Web Application is essentially a web site stored on your device and built using web languages, such as HTML5, CSS, and JavaScript. The web application uses the Tizen Web Framework to interact with the native subsystems.

    The web applications use the Web API, which is a standard web application project structure with basic elements. The web API is designed to allow you to easily build applications using web languages.

    A program built using the Web API is laid out much like a standard web site with an index.html file that serves as the root, and separate directories for resources, such as JavaScript, CSS, images, and sound resources. This approach makes Web application development in Tizen extremely intuitive for developers with a background in Web development, and makes it easy to quickly write simple applications using high-level languages.

  • Native Application is developed using C and can access more advanced device-specific features, such as camera, GPS, and accelerometer in addition to more advanced system settings and functionality.

    The native applications use the Native API, which provides all of the memory management and performance benefits that come with building applications for Linux in C. The native API is extremely helpful, as it includes dozens of API modules that cover a large range of capabilities. It provides numerous interfaces to much of the hardware that is found in modern mobile and wearable devices, and does so in an environment that is tailored for limited resources.



저는 사실 Web 앱은 별로 관심 없고, Native 앱 개발에 초점을 맞춰보고 있습니다.


아래는 tizen wiki에서 찾을 수 있는 Tizen Native Application guide 이고, 

한국어 pdf파일도 있습니다! 

무려 900여 페이지 인데요. 좋은 공부자료가 될 것 같네요.


https://wiki.tizen.org/wiki/Guide_to_Developing_Tizen_Native_Application



그럼, 모두 즐거운 앱개발이 되시길 바라며!

마칩니다.



2016/04/02 - [Software Dev Note/Tizen] - 삼성 GearS2를 위한 타이젠 앱 개발하기 : [1] SDK설치 (맥 OS X)


이 댓글을 비밀 댓글로