9/30/2014

Porting LCD, Touch Screen

1. LCD 관련정리 

LCD Interface 관련정리 

  • LCD 와 Frame Buffer 
SoC에서 Frame Buffer의 역할은 중요하며, LCD가 특히 RGB Interface로 연결되었을 경우 LCD 내부에 RAM이 별도로 없으므로, 
Frame Buffer를 통해 이 Latency를 없애고자 하는 것이며, OSD 와 VIDEO Frame Buffer의 경우 갯수 또한 다르다. 

2. KERNEL 설정 

TFTP Pannel이므로, 별도의 Backlight와 Frame Buffer를 설정해야줘야 한다. 
LCD: U133WA01

  • Odroid Kernel 설정 
Odroid의 LCD 설정 및 Backlight 및 Frame Buffer 설정 
$ make menuconfig 
Device Driver-> Graphics support -> Backlight & LCD device support
        
Lowlevel LCD controls
Lowlevel Backlight controls
Generic PWM based Backlight Driver

$ make menuconfig   
Device Driver-> Graphics support ->Support for frame buffer devices->
S5P Framebuffer support
LCD init in kernel
(2)     Default Window (0-4)
(2)     Number of frame buffers (1-3)
Select LCD Type (U133WA01)

  • LCD Back Light 관련소스 
arch/arm/mach-exynos/mach-odroid-x.c  :  spi resiger, pwm
arch/arm/mach-exynos/setup-fb-odroid.c :  s3cfb_backlight_on   backright
arch/arm/plat-samsung/dev-backlight.c

  • Frame Buffer 와 LCD 관련부분 확인 
$ ls qtwork/kernel/linux-3.0.68/drivers/video/samsung
built-in.o  s3cfb_fimd6x.o  s3cfb_main.o  s3cfb.o  s3cfb_ops.o u133wa01.o

2.1 SPI 관련 추가방법  

GPIO 기반의 SPI 설정 

$ vi arch/arm/mach-exynos/mach-odroid-x.c

static struct s3c64xx_spi_csinfo spi1_csi[] = {
        [0] = {
                .line = EXYNOS4_GPB(5),
                .set_level = gpio_set_value,
                .fb_delay = 0x2,
        },
};

static struct spi_board_info spi1_board_info[] __initdata = {
        {
                .modalias = "spidev",
                .platform_data = NULL,
                .max_speed_hz = 10*1000*1000,
                .bus_num = 1,
                .chip_select = 0,
                .mode = SPI_MODE_3,
                .controller_data = &spi1_csi[0],
        }
};

......
spi_register_board_info(spi0_board_info, ARRAY_SIZE(spi0_board_info));

  • SPI Driver Based GPIO
drivers/spi/spi.c

drivers/spi/spi_gpio.c: 위의 board에서 정의된 값을 이용하여, gpio를 이용하여 기본 SPI 설정
                        이 곳에서 제대로 GPIO 제대로 설정되었는지 TEST
          
drivers/spi/spi_bitbang.c
                         위 함수를 이용하여 SPI  based on GPIO 구동
- bitbang_work           : 실제 gpio로 전송을 담당 하는 함수.
- spi_bitbang_transfer  : 전송을  전송을 하지만, queue만 넣고 실제 전송을 bitbang_work 동작


  • 관련 GPIO 설정 및 Contorl 
sys filesystem을 이용하여 쉽게 gpio로 control 
cat /sys/kernel/debug/gpio 
관련참조 
  http://th15.tistory.com/25

Touch TSC2007 


  http://codewalkerster.blogspot.kr/2014/06/optimize-setting-for-low-dpi.html
  https://access.redhat.com/documentation/ko-KR/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-cpu-irq.html

Interrupt Chattering
  http://forum.falinux.com/zbxe/index.php?document_srl=786529&mid=question
  http://mroon.tistory.com/263

9/29/2014

USB Cable로만 Linux 개발환경구축 (Exynos)

1. USB Cable로만 개발환경구축

Virtual Box를 개발 도중 , NFS 및 TFTBOOT BOOT 로 편하게 개발하고 싶은마음에,
아래 검색도중 아래의 문서들을 발견하여 다음과 같이 정리

ODROID(Embedded Linux 기반의 개발환경)

현재 ODROID의 경우 USB기반의 Network를 이용하여 개발환경을 구축이 가능하다.
이를 이용하기 위해서 Host Linux와 Device Linux의 설정을 알아보자.

  • 참고사항 (USB_NFS_HOWTO)
  http://www.aesop.or.kr/Board_Resources_General/36144
  http://www.aesop.or.kr/Board_Resources_General/36136
  http://www.aesop.or.kr/Board_Documents_Linux_Kernel/35302
  http://elinux.org/Mount_BeagleBoard_Root_Filesystem_over_NFS_via_USB
  http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidpc&bid=1032
  http://callgm.tistory.com/36
  http://vaultmicro.blogspot.kr/2013/04/usb-network-protocol.html
  http://recursive-labs.com/blog/2012/06/15/beaglebone-archlinux-gettingstarted/
  https://sites.google.com/site/computewiththinking/odroid-u2/bootloader-u-boot-fusing


2. Uboot의 dnw명령 과 DNW Tool 

uboot에 dnw라는 명령어가 존재하며 보통 TFTP 대신 목적으로 사용한다
이는 현재 Exynos에서만 지원해주고 있는 것 같다.
원리는 Taget Device의 uboot에서 OTG의 Device Mode 동작이 되고 Host Linux와 통신한다.
이 때 uboot에서는 dnw 명령과 Host에서는 DNW Tool이 필요하다
현재 Odroid인 경우 smdk-usbdl를 이용하여 Exynos를 지원해주고 있다.

관련 Tool: Window 및 Linux 용이 존재.

2.1 Host Linux용 DNW Tool 설치

Host Linux에서 아래의 파일을 Download하고 아래와 같이 설치를 해주면

  • Linux-dltool.tar.gz Download 
  http://bumnux.tistory.com/m/4?category=306215


 $ sudo apt-get install libusb-dev
 $ sudo cp smdk-usbdl /usr/local/bin
 $ apt-get install libusb-0.1-4:i386   (for 64bit)

이제 HOST Linux에서 smdk-usbdl를 이용하여 이제 uboot로 전송가능하다

2.2  UBOOT의 DNW 개발환경설정 

  • Target Device에서 UBOOT dnw명령 확인 
Serial 연결 후,  Reset 한 후, Uboot로 진입 한 후 dnw 명령 실행.
Host에서  System MCU SEC S3C6400X Test B/D USB를 인식 가능하며 아래의 Virtual Box에도 설정을 해주자.

 Exynos4412 # dnw 0xC0008000 


  • Host에서 Virtual Box  관리자 설정      
Main Virtual Box  관리자의  머신->설정->USB  추가

   System MCU SEC S3C6400X Test B/D [0100] 추가  (VID:04e8, PID: 1234)


  • Host에서 실행중 Virtual Box 확인
UBOOT에서 dnw 실행 후,
실행 중인  Virtual Box의 장치-> USB 장치 확인 및 앞에 체크 표시 확인
 
   System MCU SEC S3C6400X Test B/D [0100]


2.3 Uboot의 dnw TEST 진행


  • Target Device에서 UBOOT 명령 실행

아래와 같이 uboot에서 dnw 명령이 지원이 되어야 한다.

 Exynos4412 # dnw 0xC0008000 


  • Host Linux에서 Kernel Image Load 

아래와 같이 smdk-usbdl을 이용하여 Kernel Image를 Load 해보자

$ sudo smdk-usbdl -f arch/arm/boot/zImage -a 0xC0008000 
SMDK42XX,S3C64XX USB Download Tool
Version 0.20 (c) 2004,2005,2006 Ben Dooks 

S3C64XX Detected!
=> found device: bus 001, dev 005
=> loaded 2311724 bytes from arch/arm/boot/zImage
=> Downloading 2311734 bytes to 0x40008000
=> Data checksum 26c6
=> usb_bulk_write() returned 2311734

만약 Window에서 사용하고 싶다면, Window DNW Tool을 사용, 아래 참조 방법은 동일

  •  For Linux SMDK-USBDL
  http://www.fluff.org/ben/smdk/tools/
  http://dreamlog.tistory.com/165
  • for Window 7
  https://code.google.com/p/s3c6410kits/downloads/detail?name=dnw-for-
win7.rar&can=2&q=
  • Window
  http://en.pudn.com/downloads74/sourcecode/others/detail269293_en.html
  • How to install on Linux
  https://code.google.com/p/dnw-linux/ 


3. USB-CDC를 이용한 NFS 설정

이제 UBOOT에서 Kernel을 USB를 통해가져오면,  USB-CDC Gadget을 이용하여 Host Linux에서 USB Network를 이용한다


3.1 Target Device에서 Kernel설정

우선 아래와 같이 USB-CDC Gadget Driver를 추가하여, USB로 Network가 가능하도록 하자.

* KERNEL에서 RNDIS 및 USB Gadet Driver CDC추가와 NFS 지원 확인
  • 아래와 같이 Kernel 설정을 추가
$ make menuconfig
[ * ] File systems -> Network File System -> NFS client support 를 체크하고
NFS client support for NFS version 3 및 Root file system on NFS 를 선택

[ * ] Device Drivers -> USB support -> USB Gadget Support -> USB Gadget Drivers 
      (Ethernet Gadget (with CDC Ethernet support)) 로 변경 및 [*]  아래 RNDIS support (NEW) 확인 
* Built-in으로 변경                                                                               
  • 확인사항
$ vi .config
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
CONFIG_USB_USBNET=y
CONFIG_USB_NET_SMSC95XX=y
CONFIG_USB=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
CONFIG_ROOT_NFS=y


3.2 Host Linux에서 NFS Server 설정

기본으로 NFS가 설치가 안되어있기에, NFS관련 PKG 설치 및 설정


~$ sudo apt-get install nfs-kernel-server nfs-common portmap
~$ sudo vi /etc/exports

       /home/jhlee/qtwork/tmp1 *(rw,no_root_squash,no_all_squash,sync)
       /home/jhlee/qtwork/tmp2 *(rw,no_root_squash,no_all_squash,sync)

~$ sudo /etc/init.d/portmap restart
~$ sudo /etc/init.d/nfs-kernel-server restart
~$ sudo /etc/init.d/portmap restart


3.3 Host에서 Virtual Box 관리자 설정 

Device에서 Kernel의 USB Gadget인 USB-CDC의 RNDIS를 이미 설치했기때문에,
아래와 같이 이를 Host에서 인식하기 위해서 Virtual Box를 설정해준다.

Kernel zImage를 적용 후, 다시 Image를 writing 을 한 후 USB 필터 추가

  * WINDOW RNDIS/Ethernet Driver는 필요가 없기에  취소 
  * VirtualBox USB Driver 가 문제가 있다면 아래의 연결에 문제 발생 (재설치)

  • Virtual Box  관리자 설정 
Main Virtual Box  관리자의  머신->설정->USB  추가
         Linux 3.0.68 with s3c-udc RNDIS/Ethernet Gadget [0326] 추가

  • 실행중 Virtual Box 확인
UBOOT에서 dnw 실행 후, 실행 중인  Virtual Box의 장치-> USB 장치 확인 및 앞에 체크 표시 확인

         Linux 3.0.68 with s3c-udc RNDIS/Ethernet Gadget [0326]


3.4 Target Device에서 NFS 및 NETWORK TEST

  • NFS Mount TEST 
TARGET 일반 부팅 후 아래와 같이 NFS TEST

 mount -t nfs 192.168.1.1:/home/jhlee/qtwork/tmp2 /tmp 

그리고 lsusb로  연결확인

  • Network Test 
Guest OS Linux
$ ifconfig usb0 192.168.1.1

TARGET
# ifconfig usb0 192.168.1.2
# ping 192.168.1.1 

기본 동작 Exynos에서 동작은 하는데, TARGET에서 IP가 일정시간이 지나면 없어짐
네트워크문제 발생


4. Linux 개발환경설정 


4.1 Host Linux에서 udev 설정

Host Linux에서는 이제 udev 관련 rules들을 변경하여 Hotplug가 가능하도록 해주자.

1. dnw 관련 uboot에서 tftpboot 처럼 이용하여 kernel Image를 Device로 전송
2. Kernel은 USB-CDC의 Gadget을 이용하여 NFS를 Mount 한다

  • DNW Tool 설정 

$vi  /etc/udev/rules.d/80-dnw.rules
SUBSYSTEMS=="usb",  ATTRS{idVendor}=="04e8",  ATTRS{idProduct}=="1234", 
RUN+="/usr/local/bin/smdk-usbdl  -a  0xc0008000  -f /tftpboot/zImage"

  • NFS 관련설정

$ vi /etc/udev/rules.d/85-ifupdown.rules
ACTION=="remove",  RUN+="/sbin/start-stop-daemon  --start  --background  --pidfile 
/var/run/network/bogus  --startas  /sbin/ifdown  --  --allow  auto  $env{INTERFACE}"
LABEL="net_end"

KERNEL=="usb0"  RUN+="/etc/init.d/nfs-kernel-server  restart"
SUBSYSTEM=="usb",  ACTION=="add",  DRIVERS=="?*",  KERNEL=="usb0",  NAME="eth0" 

상위 파일 존재하고 이미 있다면, 아래부분만 추가 및 확인 ( NFS Restart )

$ vi /etc/udev/rules.d/85-ifupdown.rules
....
KERNEL=="usb0"  RUN+="/etc/init.d/nfs-kernel-server  restart"
SUBSYSTEM=="usb",  ACTION=="add",  DRIVERS=="?*",  KERNEL=="usb0",  NAME="eth0" 


  • USB0 Network 설정 및 network 재설정
Host Linux에서 이제 아래와 같이 usb0의 HOST Server 주소를 고정해준다.
usb0과 eth0을 NAT로 설정한다.

$ vi /etc/newtowrk/interfaces
auto lo
iface lo inet loopback

auto  usb0
iface  usb0  inet  static
address  192.168.1.1
netmask  255.255.255.0
broadcast  192.168.1.255 
up  /sbin/iptables  -A  POSTROUTING  -t  nat  -o  eth0  -j  MASQUERADE
up  echo  1  >  /proc/sys/net/ipv4/ip_forward
down  /sbin/iptables  -D  POSTROUTING  -t  nat  -o  eth0  -j  MASQUERADE
down  echo  0  >  /proc/sys/net/ipv4/ip_forward 


  • iptable 사용법

  http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-ko-4/s1-firewall-ipt-fwd.html

4.2 Boot 환경설정 (Device)


수정 전 boot.scr
setenv initrd_high "0xffffffff"
setenv fdt_high "0xffffffff"
setenv fb_x_res "1280"
setenv fb_y_res "720"
setenv hdmi_phy_res "720"
setenv bootcmd "fatload mmc 0:1 0x40008000 zImage; fatload mmc 0:1 0x42000000 uInitrd; bootm 0x40008000 0x42000000"
setenv bootargs "console=tty1 console=ttySAC1,115200n8 fb_x_res=${fb_x_res} fb_y_res=${fb_y_res} hdmi_phy_res=${hdmi_phy_res} root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro mem=1023M"
boot


수정 후 boot.scr
setenv initrd_high "0xffffffff"
setenv fdt_high "0xffffffff"
setenv fb_x_res "1280"
setenv fb_y_res "720"
setenv hdmi_phy_res "720"
setenv serverip  "192.168.1.1"
setenv ipaddr  "192.168.1.2"
setenv gatewayip  "192.168.1.1"
setenv bootcmd "dnw  0xc0008000; fatload mmc 0:1 0x42000000 uInitrd; bootm 0xc0008000 0x42000000"
setenv bootargs "console=tty1 console=ttySAC1,115200n8 fb_x_res=${fb_x_res} fb_y_res=${fb_y_res} hdmi_phy_res=${hdmi_phy_res} root=/dev/nfs  rw  nfsroot=192.168.1.1:/home/jhlee/qtwork/tmp2 
ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0::usb0:off init=/init  mem=1023M"
boot




setenv  serverip  192.168.1.1;setenv  ipaddr  192.168.1.2;setenv  gatewayip  192.168.1.1 


9/24/2014

Kernel의 printk debug-1

1. Linux Kernel Debug 설정

linux kernel 의 config 설정과 관련된 부분

2. Linux Print 관련 Debug 

관련내용
  https://elinux.org/Debugging_by_printing

  • Kernel Config 설정확인 

$ cd linux
$ vi .config   


#
# printk and dmesg options
#
CONFIG_PRINTK_TIME=y                    //  printk의 time 정보  
CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4       //  Log Level 설정  
# CONFIG_BOOT_PRINTK_DELAY is not set
# CONFIG_DYNAMIC_DEBUG is not set


Name String Meaning alias function
KERN_EMERG "0" Emergency messages, system is about to crash or is unstable pr_emerg
KERN_ALERT"1"Something bad happened and action must be taken immediatelypr_alert
KERN_CRIT"2"A critical condition occurred like a serious hardware/software failurepr_emerg
KERN_ERR"3"An error condition, often used by drivers to indicate difficulties with the hardwarepr_crit
KERN_WARNING"4"A warning, meaning nothing serious by itself but might indicate problemspr_err
KERN_NOTICE"5"Nothing serious, but notably nevertheless. Often used to report security events.pr_notice
KERN_INFO"6"Informational message e.g. startup information at driver initializationpr_info
KERN_DEBUG"7"Debug messagespr_debug
KERN_DEFAULT"d"The default kernel loglevel
KERN_CONT"""continued" line of log printoutpr_cont

아래와 같이 printk로 각각 debug 가능

printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line); 


  • 초기의 디버깅 
Kernel Boot 초기에 Print가 Serial 설정 및 초기화 문제로 아래와 같이 설정을 해줘야한다.
추후 필요 없다면 삭제

CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_KERNEL=y

Kernel Hacking-> Kernel low-level debugging functions

  http://forum.falinux.com/zbxe/index.php?mid=lecture_tip&page=82&document_srl=519453

  • 별도의 각각의 Device의 Debug가 필요하다면 설정 
ALSA Debug

CONFIG_SND_VERBOSE_PRINTK
CONFIG_SND_DEBUG

  https://cateee.net/lkddb/web-lkddb/SND_DEBUG.html


2.1 User에서 Kernel Message 설정 및 확인 

일반적인 Kernel Debug방법이며, printk를 이용하여 쉽게 debug가 가능하며, dmesg를 이용하여 boot time 역시 쉽게 알수 있다.

  • User에서 Kernel printk 설정 

$ cat /proc/sys/kernel/printk
7 4 1 3
current default minimum boot-time-default

$ sudo -s

$ echo 3 > /proc/sys/kernel/printk

$ cat /proc/sys/kernel/printk   // current 만 변경 
3 4 1 3

$ echo "7 4 1 7" > /proc/sys/kernel/printk

$ cat /proc/sys/kernel/printk  // reboot 되면 원래 설정으로 돌아감 
7 4 1 7

$ dmesg   // kernel message 확인 


  https://www.kernel.org/doc/Documentation/
  https://www.kernel.org/doc/Documentation/kernel-parameters.txt

9/23/2014

TTL vs CMOS Gate

1. 기본지식


http://de.wikipedia.org/wiki/Bipolartransistor




         




1. TTL

http://www.electronics-tutorials.ws/logic/logic_1.html
http://ibiblio.org/kuphaldt/electricCircuits/Digital/DIGI_3.html#xtocid653312

1.1 Push-pull (Totem pole)

http://en.wikipedia.org/wiki/Transistor%E2%80%93transistor_logic

TTL NAND Gate Logic

위의 기본으로 이해하기위해서, multiple emitter transistor 이해를 해야 가능하다.

    V1 이 Mulitple emitter TR  : 기본적인 NAND GATE로 동작

  •     V2의 TR , ON 될 경우, V4의 TR이 동작되어 GR 연결  U3 == 0 
  •     V2의 TR , OFF될 경우 V4의 TR이 동작되지 않아       U3 == 1 


전류의 흐름 파악하기
   
    현재 저항이 병렬로 연결이 되어 있으며, 저항에 걸린 전류들을 계산해보자.
    I = V/R 로 각각 계산을 해보면,

  •  I1 = 5V/4K   =  1.25mA (R1)
  •  I2 = 5V/1.6K =  3.125mA (R2)
  •  I3 = 5V/130  =  38.46 mA (R3)


U1,  U2           U3

0      0            1
1      0            1
0      1            1
1      1            0

http://www.allaboutcircuits.com/vol_4/chpt_3/5.html   (TTL NAND)
http://www.allaboutcircuits.com/vol_4/chpt_3/6.html   (TTL NOR)

http://ko.wikipedia.org/wiki/%ED%8A%B8%EB%9E%9C%EC%A7%80%EC%8A%A4%ED%84%B0
http://hyperphysics.phy-astr.gsu.edu/hbase/electronic/nand2.html

1.2 Open Collector

http://en.wikipedia.org/wiki/Open_collector

1.3 3 state(tri state) TTL

Hiz 지원


2. CMOS

1.1 nand gate


http://www.allaboutcircuits.com/vol_4/chpt_3/7.html (CMOS NAND NOR)

1.2 open drain




3. 기본용어


http://www.allaboutcircuits.com/vol_4/chpt_3/8.html  (3 state )

Fan in, out


Threshold level , hysteresis 135 pages
http://m.blog.naver.com/paval777/178631947


http://blog.daum.net/danuplus/57
http://egloos.zum.com/recipes/v/4968668

Google Chart 사용방법

1. Google Chart 기본사용

구글에서 제공하는 Google Chart 기능을 사용을 해보자. 기본적으로 사용하는 것이 Table이며,
다른 예제들이 많이 있다.
사용하는 방법은 script을 가 head에 있지만 이를 body에서 사용을 하면된다.

  https://developers.google.com/chart/interactive/docs/quick_start

  • Google Chart의 Table 
Table의 예제이며, Old Style과 New Style이며 현재 아래로 같이 사용하는 방법이 변하고 있다.
간단히 분석을 해보자.

<script src="https://www.google.com/jsapi" type="text/javascript"></script>
    <script type="text/javascript">
      google.load("visualization", "1", {packages:["table"]});  // Google Chart의 Table 기능 사용 
      
      google.setOnLoadCallback(drawTable_OLD);    // Call Back 함수 등록 

      function drawTable_OLD() {                  // Call Back 함수 정의 
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Name');
        data.addColumn('number', 'Salary');
        data.addColumn('boolean', 'Full Time Employee');   // Table의 Column 등록 


        data.addRows([
          ['Mike',  {v: 10000, f: '$10,000'}, true],         // Table의 Rows 등록 
          ['Jim',   {v:8000,   f: '$8,000'},  false],
          ['Alice', {v: 12500, f: '$12,500'}, true],
          ['Bob',   {v: 7000,  f: '$7,000'},  true]
        ]);

        var table = new google.visualization.Table(document.getElementById('table_div_example_old'));   // table id :  table_div_example_old 정의 

        table.draw(data, {showRowNumber: true, width: '100%', height: '100%'});
      }
</script>

<script src="https://www.gstatic.com/charts/loader.js" type="text/javascript"></script>
    <script type="text/javascript">
      google.charts.load('current', {'packages':['table']});
      google.charts.setOnLoadCallback(drawTable_NEW);

      function drawTable_NEW() {
        var data = new google.visualization.DataTable();
        data.addColumn('string', 'Name');
        data.addColumn('number', 'Salary');
        data.addColumn('boolean', 'Full Time Employee');
        data.addRows([
          ['Mike',  {v: 10000, f: '$10,000'}, true],
          ['Jim',   {v:8000,   f: '$8,000'},  false],
          ['Alice', {v: 12500, f: '$12,500'}, true],
          ['Bob',   {v: 7000,  f: '$7,000'},  true]
        ]);

        var table = new google.visualization.Table(document.getElementById('table_div_example_new'));

        table.draw(data, {showRowNumber: true, width: '100%', height: '100%'});
      }
</script>
<br />
OLD Type Table<br />
<div id="table_div_example_old"> </div> <br /> // 위에서 정의한 table id 사용  table_div_example_old
NEW Type Table<br />
<div id="table_div_example_new"> </div> 


OLD Type Table

NEW Type Table

 Table 관련 참조
  https://developers.google.com/chart/interactive/docs/gallery/table


2. Chart Gallery   


  https://developers.google.com/chart/interactive/docs/gallery
  https://developers.google.com/chart/

Google Chart에서 관련 예제를 제공하기 때문에 쉽게 사용이 가능하다.
보통 script를 <head> 안에 넣는데, 이를 <body> 안에 넣고 사용을 해보자

복합적으로 사용이 가능하며, event 및 animation도 사용이 가능하다
사용방법은 역시 기본은 위와 같이 사용을 하면 된다.

  • 복합적으로 사용하는 예제

  https://developers.google.com/chart/interactive/docs/examples#table_example


IMAGE 수정 및 boot.scr 관리

1. Uboot Script 

Uboot Script 이며, Uboot 에서 사용하는 Command들을 나열하여 사용하는 일종의 Shell Script이라고 생각하면 되겠다.
boot.txt or boot.cmd 로 uboot command를 정의한 후 이를 mkimage를 이용하여 변형을 해주고, Uboot에서 이를 load에서 해서 이 Uboot Script를 사용하면 된다.

  https://www.denx.de/wiki/DULG/UBootScripts


1.1 How to make boot.scr

 mkimage -A arm -T script -C none -n "Boot.scr for odroid" -d ./boot.txt ./boot.scr 
  • boot.txt : string 
  • boot.scr : result

1.2 Uboot 환경변수 설정소스 파악  

기본적으로 Uboot에서 설정되는 환경설정값들을 각각의 EVM or Board마다 다르므로, 본인의 소스 위치를 파악하여 알아보자.

Uboot 에서 BOOTCOMAND는 bootcmd 의 환경설정값 이며, boot.scr 안에서 Kernel를 Load하고 본인이 원하는 기능을 추가하여 넣자.

  • Uboot 의 CONFIG_BOOTCOMMAND (bootcmd ) 
Uboot에서 bootcmd 설정

$ vi /include/configs/smdk4412.h  //EXYNOS의 UBOOT bootcmd 설정 
#if defined(CONFIG_HKDK4412) && defined(CONFIG_EXYNOS_PRIME)
    #define CONFIG_BOOTCOMMAND  \
        " mmc rescan 0:1; mmc rescan 0:2; "     \
        " if run loadbootscript_1; "            \
        "    then run bootscript; "             \
        " else "                                \
        "    if run loadbootscript_2; "         \
        "        then run bootscript; "         \
        "    else "                             \
        "        run default_bootcmd; "         \
        "    fi ;"                              \
        " fi ; "                                
   ...


  • Uboot 기본환경설정 
상위의 CONFIG_BOOTCOMMAND 와 Uboot의 전체 기본 환경설정값

$ vi ./include/env_default.h // UBOOT 환경설정 값 
const unsigned char default_environment[] = {
#endif
#if defined(CONFIG_HKDK4412) && defined(CONFIG_EXYNOS_PRIME)
    "bootscript=source 40008000\0"
    "default_bootcmd=echo >>> Run Default Bootcmd <<<;movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000\0"
    "loadbootscript_1=echo >>> Load Boot Script from mmc 0:1 <<<;fatload mmc 0:1 40008000 boot.scr\0"
    "loadbootscript_2=echo >>> Load Boot Script from mmc 0:2 <<<;fatload mmc 0:2 40008000 boot.scr\0"
    "usb_invert_clken=0\0"
#endif
...
#ifdef  CONFIG_BOOTCOMMAND
        "bootcmd="      CONFIG_BOOTCOMMAND              "\0"
#endif


  • Serial에서 Uboot 환경설정확인 

Exynos4412 # pri
baudrate=115200
bootargs=fb_x_res=1280 fb_y_res=720 hdmi_phy_res=720 
bootcmd= mmc rescan 0:1; mmc rescan 0:2;  if run loadbootscript_1;     then run bootscript;  else     if run loadbootscript_2;         then run bootscript;     else         run default_bootcmd;     fi ; fi ; 
bootdelay=5
bootscript=source 40008000
default_bootcmd=echo >>> Run Default Bootcmd <<<;movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000
ethact=usb_ether
loadbootscript_1=echo >>> Load Boot Script from mmc 0:1 <<<;fatload mmc 0:1 40008000 boot.scr
loadbootscript_2=echo >>> Load Boot Script from mmc 0:2 <<<;fatload mmc 0:2 40008000 boot.scr
preboot=setenv stdin serial,nc
stderr=serial
stdin=serial
stdout=serial
usb_invert_clken=0
usbethaddr=DE:AD:BE:EF:00:03

관련참고
  http://elinux.org/ECE597_boot.scr   ( OMAP 기준 설명)
  http://forum.odroid.com/viewtopic.php?f=52&t=1104
  https://wiki.linaro.org/Resources/HowTo/boot.scr


2. Android Image 

ODROID에서 제공하는 Android Image들은 크게 아래와 같이 3 종류인 것 같으며, 각 설정에 변경이 되는 것 같다.

Download  Site 
  http://dn.odroid.com/4412/Android/


2.1 ODROID-X2의 Android Image 종류

  1. emmc_self_installer.zip   : Image를 emmc에  굽고, emmc에 모든것이 설치됨.
  2. sd2emmc_installer.zip    :  Image를 SD카드에 굽고, emmc에 모든것이 설치됨.
  3. sd_self_installer.zip        : Image를 SD카드에 굽고  SD카드에 모든것이 설치됨.
위 설정은 boot.scr의 아래 값에 의해 결정

#setenv device   "0"
#setenv ToSDMMC  "0"

2.2 ODROID-X2의 Android Image 구조 


  • Download Image
   sd_self_installer.img


  • sd_self_installer.img의 구성 
  1.  0~100M:  BL1,BL2, UBOOT 있을 거라고 생각 
  2.  FAT:  FAT Partion만 존재.



$ fdisk -l /media/sf_SHARED/images/sd_self_installer.img 

Disk /media/sf_SHARED/images/sd_self_installer.img: 524 MB, 524288000 bytes
189 heads, 61 sectors/track, 88 cylinders, total 1024000 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
Disk identifier: 0x00008403

                                        Device Boot      Start         End      Blocks   Id  System
/media/sf_SHARED/images/sd_self_installer.img1          204800     1023999      409600    b  W95 FAT32 

// 204800 x 512 = 104857600  100M 부터설정,  
// Blocks: 1k단위로 되는 것 같고, Start,End 512 byte 단위로 되는 것 같다 

  • /media/sf_SHARED/images/sd_self_installer.img1
// offset  104857600= 204800 x 512 bytes
$ sudo mount -o loop,offset=104857600 /media/sf_SHARED/images/sd_self_installer.img ./tmp1
or 
$ sudo mount -o loop,offset=$((512 * 204800)) /media/sf_SHARED/images/sd_self_installer.img ./tmp1

$ ls ./tmp1
bl1.bin   cache_aa   system_ac system_af  system_ai  system_al  system_ao  system_ar  tzsw.bin     userdata_ab
bl2.bin   system_aa  system_ad system_ag  system_aj  system_am  system_ap  system_as  u-boot.bin   userdata_ac
boot.scr  system_ab  system_ae system_ah  system_ak  system_an  system_aq  system_at  userdata_aa  zImage

한번 install이 되면, 그 이후에 아래의 구조가 존재하지 않는다.
Fastboot에 의해 Android 를 SD Write를 한다.


2.3 boot.scr (android)  분석 
Uboot의 boot.txt  아래의 command를 나열하고 mkimage로 header를 붙혀주면된다.

 //앞부분, Image 정보부분이라서 깨짐
# BootScript for Odroid (2013/01/28)
#
#
# Boot.scr make script
#
# mkimage -A arm -T script -C none -n "Boot.scr for odroid" -d ./boot.ini ./boot.scr
#

# EMMC Self Update
#setenv device   "0"
#setenv ToSDMMC  "0"

# SD/MMC Self Update
setenv device   "0"
setenv ToSDMMC  "1"

# EMMC Update from SD/EMMC
#setenv device   "1"
#setenv ToSDMMC  "0"

# SD/MMC Update from EMMC
#setenv device   "1"
#setenv ToSDMMC  "1"

setenv check_oldboot "check_value 1"
setenv check_device_sd "check_value ${ToSDMMC}";
setenv check_device "check_value ${device}";
setenv mmc64gb_check "check_64gb ${device}"

if run check_oldboot;then echo >> new-bootloader <<; else echo >> old-bootloader <<; reset; fi;

#------------------------------------------------------------------------------------------------------
# UBOOT ENV Erase
#------------------------------------------------------------------------------------------------------
mmc write 0 40008000 0x4CF 0x20

fatload mmc 0:1 41000000 zImage;movi w k ${device} 41000000;

fatload mmc 0:1 44000000 system_aa;
fatload mmc 0:1 45000000 system_ab;
fatload mmc 0:1 46000000 system_ac;
fatload mmc 0:1 47000000 system_ad;
fatload mmc 0:1 48000000 system_ae;
fatload mmc 0:1 49000000 system_af;
fatload mmc 0:1 4A000000 system_ag;
fatload mmc 0:1 4B000000 system_ah;
fatload mmc 0:1 4C000000 system_ai;
fatload mmc 0:1 4D000000 system_aj;
fatload mmc 0:1 4E000000 system_ak;
fatload mmc 0:1 4F000000 system_al;
fatload mmc 0:1 50000000 system_am;
fatload mmc 0:1 51000000 system_an;
fatload mmc 0:1 52000000 system_ao;
fatload mmc 0:1 53000000 system_ap;
fatload mmc 0:1 54000000 system_aq;
fatload mmc 0:1 55000000 system_ar;
fatload mmc 0:1 56000000 system_as;
fatload mmc 0:1 57000000 system_at;

fatload mmc 0:1 58000000 userdata_aa;
fatload mmc 0:1 59000000 userdata_ab;
fatload mmc 0:1 5A000000 userdata_ac;

fatload mmc 0:1 41000000 cache_aa;

fdisk -c ${device}

fastboot flash system 44000000 0 ${device};

fastboot flash userdata 58000000 0 ${device};

fastboot flash cache 41000000 0 ${device};

fatformat mmc ${device}:1;

if run check_device; then fastboot poweroff; else reset; fi;


3. Ubuntu Image

  https://wiki.odroid.com/old_product/odroid-x_u_q/odroid_u3/u3_partition_table
  • Download Site
  http://dn.odroid.com/Ubuntu_X2/
  http://odroid.in/ubuntu_14.04lts/old_images/
  http://odroid.in/ubuntu_14.04lts/


  • Download Image
   odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img


3.1 Ubuntu Image 구조 


  • Download Image
   odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img

  • Image Partition 구성 
  1. 0~2048K: BL1,BL2,UBOOT 있을 거라고 예상
  2. FAT32:   FAT가 2048K부터 구성,(약 2Mbyte)
  3. Linux :   Linux 기본 Partion


  • Partition으로 구성확인방법 

fdisk -l  xxxx.img //512 Byte 기준표시
parted -s xxxx.img unit B print // Byte 기준표시 


$ fdisk -l  odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img

Disk odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img: 5904 MB, 5904530944 bytes
255 heads, 63 sectors/track, 717 cylinders, total 11532287 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
Disk identifier: 0x000c4046

                                                       Device Boot      Start         End      Blocks   Id  System
odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img1            4096      266239      131072    b  W95 FAT32
odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img2          266240    11532287     5633024   83  Linux


parted -s xxxxx unit B print  사용가능 (Byte 기준표시)

$ sudo parted -s /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img unit B print

  http://odroid.us/mediawiki/index.php?title=Updating_from_Root_File_System_Images


B. FAT32 Partition 정보확인

Booting에 필요한 주요파일로 구성되어 있으며, 간단히 구성을 보면 다음과 같다.
  1. board.dtb  // Device Tree Binary 
  2. boot.scr  // Uboot Script 
  3. boot.ini   // Uboot Env 설정 File 
  4. zImage,uImage   // Kernel Image
  5. uInitrd       // RAM Disk Image


$ mkdir tmp1 tmp2
                     // offset  2097152  = 4096 x 512 bytes
$ sudo mount -o loop,offset=2097152   /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp1
or
$ sudo mount -o loop,offset=$((512*4096)) /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp1

$ ls ./tmp1
board.dtb  boot  boot-hdmi1080.scr  boot-hdmi1080.txt  boot-hdmi720.scr  boot-hdmi720.txt  boot.ini  boot.scr  boot.txt  uImage  uInitrd  zImage

C. Linux Partition 정보확인

Mount 되는 Linux Fliesystem 정보로 Host Linux에서 확인을 해보자.

                     // offset  136314880 = 266240 x 512 bytes 
$ sudo mount -o loop,offset=136314880   /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp2
or
$ sudo mount -o loop,offset=$((512*266240)) /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp2
$ ls ./tmp2
bin  boot  dev etc  home  initrd.img  lib  lost+found media  mnt  opt  proc  root  run  sbin selinux  srv  sys  tmp usr  var  vmlinuz




4. Uboot script 


4.1 boot.scr  (ubuntu) 

ubuntu boot.scr  설치가 아닌  boot 이며,아래와 같이 기본 설정을 해준다.

setenv initrd_high "0xffffffff"
setenv fdt_high "0xffffffff"
setenv fb_x_res "1280"
setenv fb_y_res "720"
setenv hdmi_phy_res "720"
setenv bootcmd "fatload mmc 0:1 0x40008000 zImage; fatload mmc 0:1 0x42000000 uInitrd; bootm 0x40008000 0x42000000"
setenv bootargs "console=tty1 console=ttySAC1,115200n8 fb_x_res=${fb_x_res} fb_y_res=${fb_y_res} hdmi_phy_res=${hdmi_phy_res} root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro mem=2047M"
boot


4.2 boot.scr (dnw 적용) 

setenv initrd_high "0xffffffff"
setenv fdt_high "0xffffffff"
setenv bootcmd "dnw  0xc0008000; fatload mmc 0:1 0x42000000 uInitrd; bootm 0xc0008000 0x42000000"
setenv bootargs "console=tty1 console=ttySAC1,115200n8 root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro mem=1023M"
boot


4.3 boot.scr (printenv)
 

baudrate=115200
bootargs=fb_x_res=1280 fb_y_res=720 hdmi_phy_res=720 
bootcmd= mmc rescan 0:1; mmc rescan 0:2;  if run loadbootscript_1;     then run bootscript;  else     if run loadbootscript_2;         then run bootscript;     else         run default_bootcmd;     fi ; fi ; 
bootdelay=1
bootscript=source 40008000
default_bootcmd=echo >>> Run Default Bootcmd <<<;movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000
ethaddr=00:40:5c:26:0a:5b
gatewayip=192.168.0.1
ipaddr=192.168.0.20
loadbootscript_1=echo >>> Load Boot Script from mmc 0:1 <<<;fatload mmc 0:1 40008000 boot.scr
loadbootscript_2=echo >>> Load Boot Script from mmc 0:2 <<<;fatload mmc 0:2 40008000 boot.scr
netmask=255.255.255.0
serverip=192.168.0.10


5. mkimage 의 Image header 제거 

mkimage를 사용할 경우 헤더가  64byte 가 사용이 되며, 이는  boot시 사용이 된다. 그리고, 이와 같은 이미지가 필요 없을 경우 아래와 같이 제거 한다.
mkimage를 사용하는 것은 ramdisk, kernel image, boot.scr이 있다.

dd if=image of=recovered file bs=64 skip=1

RAMDISK의 경우 아래와 같이 mkimage를 제거하고, 압축을 풀고 카피한 다음 분석가능

gunzip initrd.gz
mkdir init
cd init
cpio -i < ../initrd


  https://wiki.linaro.org/MichaelHope/Sandbox/DebuggingOnInitrd

9/21/2014

Porting QT on ODROID (추후 정리가 필요, TEST완료)

1. Backgraound 

QT는 Trolltech사에서 개발한 UI Interface이며 현재 임베디드에서 많이 이용이 되며, Linux 뿐만 아니라 Window 및 Mac OS, Vxworks 등에서 구동이 된다.
예전에 회사에서 QT를 몇번 Porting을 했지만 매번 까먹는것 같어 정리 좀 한다.

이제 나의 장난감 ODROID에 QT를 올려보고자 한다.

A. QT 관련회사
  • Trolltech: Qt를 개발한 노르웨이 회사
  • Digia     : 현재 QT를 인수한 회사  2012년에 인수
  • Nokia: 핸드폰 제조회사로 QT 회사인 Trolltech와 QT를  2008년에 인수 했지만 이후로 Digia가 인수. 

   http://ko.wikipedia.org/wiki/Qt_(%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC)
   http://en.wikipedia.org/wiki/Qt_(software)
   http://en.wikipedia.org/wiki/Qt_Development_Frameworks


B. ODROID 관련회사

  •  hardkernel : odroid platform을 개발 
  •  linaro : ARM 기반 Linux open source를 지향하는 비영리 단체이며 ARM, Freescale, IBM, Samsung, ST-Ericsson 및 TI가 주축으로 구성이 되어 Soc가 나올 경우 이 관련 솔루션개발. 

현재 UBUNTU Image는 Linaro에서 공급을 받고 있으며, 이를 수정

   http://ko.wikipedia.org/wiki/%EB%A6%AC%EB%82%98%EB%A1%9C


2. Cross Compile 설치

기존 사용하던 Code Sourcery로는 에러가 발생하여, 다른 Cross Compiler 사용.
무료 Version이라 hard floating point 미지원 문제인 것 같다.

apt-get install 로도 가능하나, odroid 추천사이트를 아래와 같이 찾음


- 기본 환경설정
$ sudo mkdir -p /usr/local/arm >/dev/null 
$ sudo chmod 777 /usr/local/arm
$ cd /usr/local/arm

- Down Toolchain
$ cd /usr/local/arm
$ wget https://launchpadlibrarian.net/129963014/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux.tar.xz
$ xz -d gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux.tar.xz 
$ tar -xvf gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux.tar

- 의존성 문제로 Link 사용
$ ln -s gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux /usr/local/arm/toolchain

- C-Compiler Cache 설정 (옵션)
$ cd /usr/local/arm/toolchain
$ mkdir bin-ccache
# you may already have ccache installed, but for the sake of illustration...
$ sudo apt-get install ccache
$ ln -s $(which ccache) arm-linux-gnueabihf-gcc
$ ln -s $(which ccache) arm-linux-gnueabihf-g++
$ ln -s $(which ccache) arm-linux-gnueabihf-cpp
$ ln -s $(which ccache) arm-linux-gnueabihf-c++

출처:
   http://odroid.us/mediawiki/index.php?title=Step-by-step_Cross-compiling_a_Kernel


3. Ubuntu Image

  • Download
   http://dn.odroid.com/Ubuntu_X2/

   * odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img


3.1 Modify the Image

  • IMAGE의 Partition 정보 확인

$ fdisk -l  odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img

Disk odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img: 5904 MB, 5904530944 bytes
255 heads, 63 sectors/track, 717 cylinders, total 11532287 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
Disk identifier: 0x000c4046

                                                       Device Boot      Start         End      Blocks   Id  System
odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img1            4096      266239      131072    b  W95 FAT32
odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img2          266240    11532287     5633024   83  Linux

     A. FAT32 수정
         (kernel 및 boot.scr 변경)

// offset  2097152  = 4096 x 512 bytes
$  sudo mount -o loop,offset=2097152 /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp1
$ ls ./tmp1
board.dtb  boot  boot-hdmi1080.scr  boot-hdmi1080.txt  boot-hdmi720.scr  boot-hdmi720.txt  boot.ini  boot.scr  boot.txt  uImage  uInitrd  zImage
$ cd tmp1 
$ sudo cp boot.scr boot.scr.org   // backup 
$ vi boot.txt                    // mem=1023M 변경
$ sudo mkimage -A arm -T script -C none -n "Boot.scr for odroid" -d ./boot.txt ./boot.scr 


     B.Linux FS 수정
          (QT 복사 및 설정)

// offset  136314880 = 266240 x 512 bytes 
$ sudo mount -o loop,offset=136314880   /media/sf_SHARED/odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img ./tmp2
$ ls ./tmp2
bin  boot  dev etc  home  initrd.img  lib  lost+found media  mnt  opt  proc  root  run  sbin selinux  srv  sys  tmp usr  var  vmlinuz



3.3 Resize Image  (option)


기본에 존재하는 큰사이즈 Image를 줄이고, 필요없는 File System Partition 삭제
(NFS사용 ,SD도 4G가라 줄여야 함)

$ dd if=odroidx2_20130125-linaro-ubuntu-desktop_SDeMMC_with_HDMI.img of=newimage.img bs=1k count=200000

//FDISK로 두번째 partion 제거하고 사이즈를 아래와 같이 사이즈를 줄임
$ fdisk newimage.img
Command (m for help): d
Partition number (1-4): 2
Command (m for help): w
Command (m for help): p

Disk newimage.img: 204 MB, 204800000 bytes
255 heads, 63 sectors/track, 24 cylinders, total 400000 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
Disk identifier: 0x000c4046

       Device Boot      Start         End      Blocks   Id  System
newimage.img1            4096      266239      131072    b  W95 FAT32

$ sudo mount -o loop,offset=2097152 ./newimage.img ./tmp1




  • DD 관련설명

   http://forum.falinux.com/zbxe/index.php?document_srl=561988&mid=lecture_tip


4. KERNEL 

4.1 Download

  • 아래의 사이트에 가서 소스를 확인하고, 각 branch를 확인 후 down

   https://github.com/hardkernel/linux

$ git clone https://github.com/hardkernel/linux.git -b odroid-3.0.y 


4.2  Build Kernel 

$ cd linux
$ ls arch/arm/configs/odroidx2*                         // 확인후 설정
arch/arm/configs/odroidx2_android_emmc_defconfig   arch/arm/configs/odroidx2_ubuntu_defconfig
arch/arm/configs/odroidx2_android_sdmmc_defconfig  arch/arm/configs/odroidx2_ubuntu_mali_defconfig

$ make  odroidx2_ubuntu_defconfig   

$ make zImage   or make                                // make는 moudles도 함께,           
$ ls arch/arm/boot/
$ make modules -j4      
$ make modules_install  INSTALL_MOD_PATH=~/tmp          // 임시설정, 위의 Android에 복사


5. QT 


5.1 Download 

구글에서 qt-everywhere-opensource-src

   http://download.qt-project.org/archive/qt/5.2/5.2.0/single/qt-everywhere-opensource-src-5.2.0.tar.gz.mirrorlist
   http://download.qt-project.org/archive/qt/5.0/5.0.2/single/qt-everywhere-opensource-src-5.0.2.tar.gz.mirrorlist
   http://download.qt-project.org/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz.mirrorlist



5.2  TSLIB 


$ ./configure prefix=/usr/local/Qt-4.8.6 --host=arm-linux CC=arm-linux-gnueabihf-gcc
$ make
$ make install 




ts_test.o: In function `main':
ts_test.c:(.text.startup+0x228): undefined reference to `rpl_malloc'
fbutils.o: In function `open_framebuffer':
fbutils.c:(.text+0x152): undefined reference to `rpl_malloc'
collect2: error: ld returned 1 exit status
make[2]: *** [ts_test] Error 1
make[2]: Leaving directory `/home/jhlee/qtwork/qtsource/tslib/tslib-1.0/tests'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/jhlee/qtwork/qtsource/tslib/tslib-1.0'
make: *** [all] Error 2


http://egloos.zum.com/sunnmoon/v/2348814
http://jiphung.com/399


5.3 QTWebkit

git clone git://gitorious.org/+qtwebkit-developers/webkit/qtwebkit.git


sudo apt-get install bison flex libqt4-dev libqt4-opengl-dev libphonon-dev libicu-dev libsqlite3-dev libxext-dev libxrender-dev gperf libfontconfig1-dev libphonon-dev g++




Ref. QTWebkit 빌드
http://webkit.sed.hu/blog/20100427/qtwebkit-cross-compilation-gcc-arm-linux
http://linuxspot.tistory.com/249
http://www.sarangnamu.net/basic/basic_view.php?no=4603&page=47&sCategory=0

5.4 Build QT 


개발전 우분투에서 설치해줘야할 Package들

 sudo apt-get install build-essential libfontconfig1-dev libfreetype6-dev libx11-dev libxcursor-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxrandr-dev libxrender-dev


  • vi mkspecs/qws/linux-arm-g++/qmake.conf
           :1,$s/arm-linux-/arm-linux-gnueabihf-/g 와 입력하여,
           아래와 같이 수정.

# modifications to g++.conf
QMAKE_CC                = arm-linux-gnueabihf-gcc
QMAKE_CXX               = arm-linux-gnueabihf-g++
QMAKE_LINK              = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB        = arm-linux-gnueabihf-g++

# modifications to linux.conf
QMAKE_AR                = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY           = arm-linux-gnueabihf-objcopy
QMAKE_STRIP             = arm-linux-gnueabihf-strip

// TS Lib 설치 했을 경우 , Option
QMAKE_INCDIR += /usr/local/Qt-4.8.6/include
QMAKE_LIBDIR += /usr/local/Qt-4.8.6/lib -lts


  • 아래와 같이 QT source에 들어가 초기화하고, 설정 및 Make 

$ sudo -i  
$ cd qt-everywhere-opensource-src-4.8.4
$ make confclean
$  echo yes | ./configure -prefix /usr/local/Qt-4.8.6 -xplatform qws/linux-arm-g++ -embedded arm -little-endian  -release -no-largefile -no-accessibility -no-qt3support -qt-zlfile -no-accessibility -no-qt3support -qt-zlib -qt-libpng -no-libmng -qt-libjpeg -no-libtiff -no-nis -no-cups -qt-freetype -depths 16,24,32 -opensource




$ make confclean
$ echo yes | ./configure -prefix /usr/local/Qt-4.8.6 -xplatform qws/linux-arm-g++ -embedded arm -little-endian  -release -no-largefile -no-accessibility -no-qt3support -qt-zlib -qt-libpng -no-libmng -qt-libjpeg -no-libtiff -no-nis -no-cups -qt-freetype -depths 16,24,32 -opensource 

$ make -j 5
$ make install

//TSLibrary 추가

$echo yes | ./configure -prefix /usr/local/Qt-4.8.6 -xplatform qws/linux-arm-g++ -embedded arm -little-endian  -release   -no-largefile -no-accessibility  -no-qt3support -qt-zlib -qt-libpng  -qt-libjpeg  -qt-libtiff -qt-libmng  -qt-freetype -depths 16,24,32 -opensource  -qt-gfx-transformed -qt-mouse-tslib -qt-mouse-pc -webkit -qt-sql-qsqlite
$ make -j 5
$ make install




http://www.sereno-labs.com/Qt_4.8.3_installation_procedure_FriendlyARM_mini6410_Linux


6. QT Build ERRS 

1. ERROR-1


qtconcurrentiteratekernel.cpp:(.text+0x1a): undefined reference to `clock_gettime'
collect2: error: ld returned 1 exit status
make[1]: *** [../../lib/libQtCore.so.4.8.6] Error 1

vi  src/corelib/Makefile

 LIBS  = $(SUBLIBS)  -L/opt/qt-everywhere-opensource-src-4.8.4/lib -lpthread -lm -ldl -lrt


2. ERROR-2

make: *** [sub-examples-make_default-ordered] Error 2
           
                위의 Setting에서 기본환경 설치 확인

3. ERROR-3 (TSLIB)

참고사항
The tslib functionality test failed!
 You might need to modify the include and library search paths by editing
 QMAKE_INCDIR and QMAKE_LIBDIR in


TSLib 설치 및 QMAKE_LIBDIR 설정


4. 기타에러 

uentialanimationgroup.h -o .moc/release-shared-emb-arm/moc_qsequentialanimationgroup.cpp

compilation terminated.
make[1]: *** [.pch/release-shared-emb-arm/QtCore.gch/c++] Error 1
make[1]: *** Waiting for unfinished jobs...

이전에 permission 문제를 발견을 해서,

chown -R jhlee .
chgrp -R jhlee . 로 해결



5.6 Configure option 설명

-prefix /usr/local/Qt-4.8.6 : QT library가 설치될 장소 선정

-opensource : opensource 이 옵션일 경우 question 이 없어짐  (상용 –commercial)

-embedded arm : 임베디드 ARM 기반으로 빌드한다.

-platform /qws/linux-x86_64-g++ : Host에서 사용할 컴파일러(32비트 사용시는/qws/linux-x86-g++ 옵션을 사용)

-xplatform /qws/linux-dm368-g++ : Target에서 사용할 컴파일러(dm368일 경우)

-depths 16,24,32 : 지원되는 Bit-per-pixel. (콤마로 지원되는 값들을 구분)

-no-cups : CUPS를 지원하지 않도록 함.

-no-largefile : 대용량 파일을 지원하지 않도록 함.

-no-accessibility : Windows Active Accessibility을 지원하지 않도록 함.

-no-openssl : OPENSSL을 지원하지 않는다.

-no-gif : GIF 읽기를 지원하지 않는다.

-no-libtiff : TIFF를 지원하지 않는다.

-no-libmng :MNG를 지원하지 않는다.

-qt-gfx-transformed : 가속되지 않은 Linux Framebuffer(/dev/fb0)을 Enable한다.

-plugin-gfx-transformed : Linux Framebuffer를 런타임시에 링크시킨다.

-continue : 가능한 범위 내에서 오류를 무시하고 계속한다.

-no-mouse-pc : PC 마우스 드라이버를 사용하지 않는다.

-no-mouse-linuxtp : linuxtp 마우스 드라이버를 사용하지 않는다.

-qt-mouse-tslib : ‘tslib’ 터치 드라이버를 사용한다.

-plugin-mouse-tslib : ‘tslib’ 터치 드라이버를 런타임시에 링크한다.

-little-endian : Target 플랫폼은 little-endian으로 동작한다.

-host-little-endian : Host 플랫폼은 little-endian으로 동작한다.

-no-multimedia : Qt Multimedia 모듈을 빌드하지 않는다.

--no-svg : SVG(Scalable Vector Graphics) 모듈을 빌드하지 않는다.

-no-webkit : Webkit 모듈을 빌드하지 않는다.

-no-mmx : MMX 명령을 사용하지 않는다.

-no-3dnow : 3DNOW 명령을 사용하지 않는다.

-no-sse : SSE 명령을 사용하지 않는다.

-no-sse2 : SSE2 명령을 사용하지 않는다.

-no-qt3support : Qt3 지원을 사용하지 않는다.

-no-script : Qt Script를 사용하지 않는다.

-no-scripttools : Qt ScriptTools를 사용하지 않는다.

-qt-libpng : png 라이브러리를 사용한다.

-qt-zlib : zlib 옵션을 사용하도록 한다.(32비트에서만 필요할 것이다.)

-qconfig petra : qconfig-petra.h 를 참조하여 필요한 부분만 컴파일한다.

-release : 디버깅 모드를 사용하지 않고 릴리즈 모드로 컴파일한다.

-qt-sql-[driver-name]  : qmysql, qsqlite,
                                   
http://qt-project.org/doc/qt-4.8/sql-driver.html
http://qt-project.org/wiki/Building_Qt_for_Embedded_Linux







5.3  QT TEST 

http://processors.wiki.ti.com/index.php/Qt_Tips
http://com.odroid.com/sigong/blog/blog_list.php?bid=133

기본환경 설정


  • cat /etc/X11/xorg.conf
기존사용하던 Interface 파악, FB6 HDMI, FB0 LCD

  //FB6 HDMI  , FB0 LCD
Section "Device"
        identifier "FBDEV"
        Driver "fbdev"
        Option "fbdev" "/dev/fb6"
EndSection

Section "Screen"
        identifier "Default Screen"
        Device "FBDEV"
        DefaultDepth 16
EndSection


  • vi /etc/enviornments   or   /etc/rc.local  (/etc/rc.local 동작안함)


export QWS_DISPLAY="LinuxFb:/dev/fb6"
export LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/Qt-4.8.6/lib:/usr/local/lib
export PATH=$PATH:/usr/local/bin:/usr/local/Qt-4.8.6/demos/deform

export QWS_DISPLAY="LinuxFb:/dev/fb6"
export QWS_MOUSE_PROTO="USB:/dev/input/event1"
export LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/Qt-4.8.6/lib
export PATH=/bin:/sbin:/usr/bin/:/usr/sbin:/usr/local/bin:/usr/local/Qt-4.8.6/demos/deform
cd /usr/local/Qt-4.8.6/demos/deform
./deform -qws


  • ./deform -qws -display LinuxFb:/dev/fb6 // -display 옵션, Multi로 사용가능



  • 관련 link

QTWebKit
  http://linuxspot.tistory.com/249


ODROID QT Porting
  http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidx&kind=52&bid=1644

  http://napan.ca/ghpsdr3/index.php/Odroid

QT 4.7 Porting GUIDE
  http://www.jkelec.co.kr/img/arm/arm11/s3c6410_startkit/man/s3c6410_startkit_qt4.7.0_porting.html


QT 구조
  http://qt-project.org/doc/qt-4.8/qt-embedded-linux.html

QT 4.8 Porting GUIDE
  http://qt-project.org/doc/qt-4.8/qt-embedded-install.html
  http://qt-project.org/doc/qt-5/embedded-linux.html

QT 5.2
  https://www.ics.com/blog/building-qt-and-qtwayland-raspberry-pi#.VCKXLvl_uGE

QT 4.8.4
  http://galhui.tistory.com/38

  http://blog.csdn.net/wangpengqi/article/details/8728234

  http://stackoverflow.com/questions/19059596/cross-compiling-qt-for-pandaboard
  http://qt-project.org/forums/viewthread/16595
  http://forum.falinux.com/zbxe/index.php?document_srl=506571&mid=question

  http://chiccoder.tistory.com/36 
  (USB 모니터 및 Touchscreen example)

  • FILE SYSTEM 
추후에 직접 File system 을 만들거나 다른 BSP에서 가져와서 편집하자. 

  https://wiki.kldp.org/wiki.php/LinuxBasedOnUSB-StorageDevice
http://processors.wiki.ti.com/index.php/Creating_a_Root_File_System_for_Linux_on_OMAP35x
  https://emreboy.wordpress.com/2012/12/20/building-a-root-file-system-using-busybox/
  https://gist.github.com/chrisdone/02e165a0004be33734ac2334f215380e


  • Window에서 Image굽는 프로그램
  http://dn.odroid.com/DiskImager_ODROID/

9/16/2014

LCD Inteface 정리

 1. LCD Interface 기본지식 


LCD Interface는 크게 보면 3가지 종류로 나누어 볼수 있을 것 같다. 
  1. CPU Interface (Intel 8080 / Motorola 68K)로 연결되던 GRAM 기반의 Serial Interface
  2. RGB Interface 임베디드에서 흔히 볼수 있는 것으로 Parrarel Inteterface
  3. Serial Interface로 SPI Interface를 자주 이용하는 것으로 Serial Interface


  • 출처
LCD interface 정리 한번 정리하고자 하는데, 쉽게 설명한 사이트이며, 오랜전에도 봤지만, 가능 낫은 것으로 생각되며, 추후 없어질지 몰라 다시 정리한다.
1.1  CPU/MPU Interface 

Intel 8080 과 Motorola 68K기반으로  CPU or MPU Interface라고 한다고 하며, 나의 경우 거의 다루어보지 못했다. 
WR(Write), RD(Read),RS(Command/Data),CS(Chip Select) 등 구성되며, Driver IC에 별도의 RAM이 존재하여 Frame Buffer가 필요없는 것으로 보인다.  
쉽게 생각하면, GPU기반으로 생각을 하면될 것 같다. 

CS는  Low 가 일 때  Driver IC가 동작가능하며, 이 맞추어 WR/RD 신호에 따라 Parrarel DB가 Write or Read가 되어진다. 
RS(Data/Command)신호에 따라 Data 역시 Instruction 과 Data로 구분되어 전송이 되어진다.
 


이 LCD Driver IC를 보면, Serial Mode와 같이 지원하며, 아래와 같이 80은 Intel의 8080을 의미하며, 각 Data Bus의 길이를 설정한다. 



글을 이해하면서 옮겨 적는데, DB(Data Bus)0~17은 CPU/MPU에서 나오는 Data Bus이며, IB의 경우 LCD로 들어가는 신호라고 한다.
이때 생각해봐야 할것이 IB가 16 or 8Bit 밖에 지원이 안되는 것으로 보이며, 이에 맞게 HW Pin도 수정해서 해야 하는 것으로 보인다. 

상위모드 중  80-system 16bit Interface
상위사이트의 글과 그림이 좀 달라서 내 생각에는 상위 모드에서 16bit로 설정했을 경우

상위모드 중  80-system 18bit Interface 
IB가 16 or 8Bit 만 지원해서 마지막 2bit가 빠지는 것으로 보이며, 설명은 Instruction 길이이며, Data 길이는 실제 Datasheet를 봐야 할 것 같다. 

상위모드 중  80-system 8bit Interface 
16bit와 비교하여, 두번에 나누어 Instruction 전송이 되는 구조 

추후에 CPU/MPU Interface를 만나게 될 경우, 이때 제대로 한번 정리하고자 한다. 

  • Motorola 68K Series


  • Intel 8080 Series



1.2 RGB Interface

내가 LCD Interface 중 가장 많이 만들어본 Interface이며, LCD Driver를 Porting 할때 거의 이것으로 사용을 했다. 
이 경우 주로 Frame Buffer Driver가 별도로 필요로 하며, 특히 TI의 Davinci Series의 경우 거의 이 방식으로 사용을 했다. 
더불어 여기에 LVDS로 Converter도 가능해서 이 방식이 가장 많이 사용했던 것으로 기억한다.
기본적으로 Data Line은 Parrarel 16bit 와 Hsync/Vsync / Enable이런식로 나온다. 

  • 실제 Pannel의 그림영역 
VSync 후  Height 크기만큼  Hsync 와 Width Data를 나누어서 보내는 방식인데, Porch라는 것을 두어 실제 표시될 영역을 수정이 가능하다.
이것은 LCD만에 해당되는 것이 아니며, NTSC/PAL도 거의 비슷하다. 


  • VSync 와 Hsync 와 Porch
아래의 Timing은 1 Frame의 기본 Timing 이며 상위 그림에서 보여진 실제 Data는 Porch로 조절한다. 


  • LCD Timing 설정에 관련된 용어
아래의 용여들은 SoC에서 직접 Register에서 설정하여 맞추는 것이며, 각각의 SoC마다 다를 것이다. 


1.3 Serial Interface

Serial Interface라고 했는데, 다양하지만, 크게 두가지로 나누어질 것 같다. 
  1. 저속 Serial Interface: SPI 
  2. 고속 Serial interface: 고속 Serial Interface로 주로 USB 처럼 Differertial 를 사용함. 
나의 경우는 MCU에서는 SPI Interface 사용을 해봤으며, 고속 Serial Interface인 MIPI 와 LVDS,  DDI (MDDI/PDDI) 가 존재하지만, 
MIPI 와 LVDS만 경험이 있지, DDI인 MDDI/PDDI 관련부분은 경험이 없다. 

LCD Serial Interface 

  • 저속 Serial Interface SPI 
MCY에서 사용했던 기억이 있으며, Frame Buffer역시 필요가 없으며, SPI가 지원이 되는 것으로 보이면, 각각에 LCD 마다 맞추어 줘야하는 것으로 기억한다.



  • 일반적인 SPI 통신
SPI는 I2C와 달리 Open Drain 기반의 Bus방식이 아닌 GPIO기반으로 만들어진 Serial 통신이라고 생각하면 되겠다.
SPI도 다중의 Device를 붙히는것도 가능하지만, 이때 CS의 각각의 Device마다 별도로 있어야 한다. 

LCD에서 SPI는 8/9/16/17/24bit가 존재한다고 하는데, 거의 RGB 값에 의존적일 것이라고 생각한다.

  • SPI 4-Wires
SDC라는 것이 별도로 존재하며, Register 와 Data 영역을 구분하는 역할로 사용한다고 한다.



  • SPI 3 wires




  • 고속 Serial Interface들 
MIPI/LVDS/ MDDI/PDDI가 될 것 같으며, LVDS의 경우 RGB에서 직접 연결해서 사용했던걸로 기억하며, MIPI의 경우는 
지인에게 Spec을 받아 만들어 본 경험이 있지만, MIPI는 각 LCD Panel의 Datasheet를 자세히 본걸로 기억한다.

MDDI/PDDI의 경험이 없어 상위 링크에서 그림만 가져온다.





2.  LCD 에 관련된 정보 

LCD에 관련된 기본용어

9/13/2014

Linux 2.4 MMC/SD Interface 구조정리

1. DM320의 MMC/SD Driver 구현 및 관련설명정리

오래전에 Linux Kernel 2.4 기준으로 TI DM320 SD Card  와 SD-IO Spec 보고,직접 Linux Device Driver를 내 마음대로 만들어 본 경험이 있다.
물론 이 때는 Chip vendor들이 Device Driver를 제공 해주지 않으니, Chip Vendor 3rd Party에서 근무했던, 
내가 만들어 직접 개발하고 3rd Party에서 국내 각 회사에 공급했다. 

SDCard 뿐만아니라, HDMI를 비롯하여 각종 Device Drivers(Camera/LCD/Touch/Bus/등)들을 많이 만들었는데, 
우연히 예전에 정리했던 자료를 발견했으며, 그것을 오늘 간단히만 정리하려고 하며, 
현재 Linux Kernel과는 너무 많이 다르므로, 참조만 하도록하자. 

Device Driver 개발자 입장에서 생각해보면, 
USB/PCI/HPI 각 종 Bus Device Driver를 비롯하여, PATA도 만들어보고, Video MUX를 비롯하여 각종 여러 Device Driver를 개발해봤는데, 
가장 후회로 남는 것이 있다면, PCIe를 직접 개발 못해본게 좀 후회로 많이 남는다.

MMC/SD가 현재 와 많은 부분이 다를 것이며, MMC Interface 또한 많이 변경되어 왔다. 
또한 MMC Host에 따라 많이 다를 것으로 예상한다.

더불어 Linux Kernel 도 버전업 되면서 , 각 Device Driver가 Platform 화 되었으므로, 
이전과는 구조가 다르므로 주의하자.  


  • MMC&SD Card Driver 위치

 Kernel/driver/mmc 

1.1 SD/MMC Driver 기본전체구성

전체 TI의 MMC&SD Device Driver는 크게 3 부분으로 구분이 되고,Core 모듈과 MMC Block 모듈 그리고, 하드웨어에 종속적인 모듈로 구성이 된다.
만약 MMC&SD카드 Driver을 작성하고자 한다면, 전체 Driver를 작성할 필요 없이 mmc_hardware 부분 소스만 TI의 Datasheet를 보고 새로 작성을 하면된다.

  • MMC_CORE (MMC 공통사항)
Files: mmc.c mmc_queue.c mmc_sysfs.c
Description:
  mmc_block에서 등록이 된, Device들을 초기화 하고, MMC&SD Spec에 관한 Function 및 Hotplug에 관한 Function으로 구성이 되어있다.


  • MMC_BLOCK  ( block device driver)
Files: mmc_block.c
Description:
  mmc & sd card block device driver 함수들이 존재 한다. mmcblk의 block device 관련 함수들이 존재 한다.


  • mmc_hardware ( TI DM320 관련부분)
Files: dm320_mmc.c
Description:
  실제적인 MMC & SD Card Driver이며, Hardware에 종속적인 소스들로만 구성이 되어있다. 이 부분은 아래에서 자세히 다루겠다.


1.2 MMC & MMC_BLOCK 구성

MMC/SD Driver는 SD Card를 Hard disk Driver와 유사하게 인식을 하며, 그래서 기본적인 구성은 Hard disk의 Block Device Driver의 기본구조 유사하다.
이전에 FPGA관련 PATA Block Device driver도 직접 만들었 본 경험이 있어 볼 때마다 재미있다.
SD/MMC Block device driver의 구성은 다음과 같다

  • static int __init mmc_blk_init(void)
Module이 처음 올라갈 때, 실행이 되며, Block Device Driver를 등록한다.
중요함수: register_blkdev(major, "mmc");


  • static void __exit mmc_blk_exit(void)
Module이 내려 갈 때 실행이 되며, Block Device Driver를 해제한다.
중요함수: unregister_blkdev(major, "mmc");


  • static int mmc_blk_probe(struct mmc_card *card)
kerenl의 module이 올라가고 처음 block device driver가 잡힐 때
mmc_blk_alloc
  *alloc_disk
  *mmc_init_queue
     *blk_init_queue() (request 함수를 등록을 한다.)
     *mmc_queue_thread (mmc_queue thread 시작)
  *md->block_bits = 9; // 2G 이상 지원 (이 부분만 수정하면, 2G 이상 지원)
  *blk_queue_hardsect_size(Sector 크기 설정)
  *set_capacity (block 수 설정)
  *md->queue.prep_fn = mmc_blk_prep_rq;
  *md->queue.issue_fn = mmc_blk_issue_rq; (MMC Request 함수)

  • static void mmc_blk_remove(struct mmc_card *card)
block device driver가 제거될때

  • static int mmc_blk_suspend(struct mmc_card *card, pm_message_t state)
block device driver가 suspend가 될 경우
  • static int mmc_blk_resume(struct mmc_card *card)
block device drver를 resume 할 때


이전에 MMC Device Driver (SD Card / SD IO)를 Linux에서 직접구현하면서 간단히 정리 한 후 만든 간단히 도표이며,
나의 경우는 아래와 같이 Polling 모드로 동작하는 구조구현을 했다.




  • DM320 MMC Block Device Driver 내부동작
상위의 함수 mmc_queue_thread 기준으로 다시 한번 Flow를 보며, MMC Interface가 CMD 방식으로 동작하기 때문에 이 관련부분이 중요.
mmc_queue_thread    (Block Device Request 함수)
  *mmc_blk_issue_rq (실제적인 Request 함수)
     blk_rq_map_sg (block driver의 make_request 함수)
        MMC_READ_MULTIPLE_BLOCK
            *mmc_wait_for_read_data()
               *read_from_card()
        MMC_WRITE_MULTIPLE_BLOCK
            *mmc_wait_for_write_data()
                *write_from_card()   

위에서 전체 Block Device Driver의 Flow을 보면 동작방식은 간단히 다음과 같다.
  1. Block Device Driver를 등록하고, blk_init_queue 함수를 이용하여 request 함수를 등록한다.
  2. Kernel Queue Thread를 생성하고 항시 mmc_request가 오기를 항상 대기한다.(무한 루프)
  3. 커널에서 mmc_request 요청이 오면, 멈춰 있던 Kernel Thread를 작동시킨다.
  4. 커널에서 요청한 Request Function을 수행을 한다( Read & Write)


1.3 DM320 MMC/SD Device Driver 

앞서 말한 것와 같이 MMC/SD Device Driver는 Hardrware 부분의 종속된 부분만 구현하면 되지만, 
이전에 Dm320는 다른부분(mmc.c 및 기타부분)도 같이 보완해서 구현했다.
그리고, 추후에 WIFI를 위해서 SDIO를 지원하기 위해서 다른부분도 넣고 수정했는데, 거의 10년 전일이라 정리를 못하겠다. 
이 부분은 문서는 Linux에서 제공하는 Platform에 맞추어 Porting하는 부분으로 구성하였다. 
추후 다시 구현하거나 수정할 기회가 있다면 그때 정리하자

  • Linux에서 구현해야 할 함수 및 설정

static struct mmc_host_ops<
   .request = mmc_request  //MMC Request 이 전체의 Block Device의 실제적인 Request
   .set_ios = mmc_set_ios //Hardware Setting Init혹은 Voltage 설정. Bus width설정. Power 설정. Busmode
   .get_ro = get_write_protect_status  //ReadOnly 지원할 경우 

static struct device_driver
   .bus     = &platform_bus_type,
   .probe   = mmc_probe,   //MMC Host 에 관련된 초기화 설정

   .remove  = mmc_remove,
   .suspend = NULL,

   .resume  = NULL,


Kernel에서 요청하는 Page 수를 크게 하고 싶다면, 아래의 Segments 값을 변경을 하면되지만, 
변경시 한번에 전송하는 사이즈 값이 커진다. (주의: DMA 크기문제)

 mmc->max_hw_segs = 64;  //DMA Size 주의 
  mmc->max_phys_segs = 64;

  mmc->max_sectors = 128; // MAX Segments 값



  • Linux에서 각 함수 동작순서

mmc_alloc_host
  mmc_rescan
     mmc_claim_host
     mmc_check_cards
     mmc_setup
        mmc_power_up
        mmc_idle_cards
        mmc_send_op_cond    //OCR Register Read , 아래 참조 
        mmc_discover_cards  //ALL_CID & SEND_RELATIVE_ADDRESS
        mmc_read_csds       // CSD Register Read
        mmc_read_scrs       // SCR Register Read
            src_read
               init_clocks   // 변경 25MHz , SDIO일 경우는 50MHz 
        mmc_calculate_clock
        mmc_release_host


세부 구현 내용은 다른 소스를 참고하며 각 Chip Maker마다 다르므로 Datasheet를 보고 동작원리를 파악하자


1.4 Kernel 설정 및 MMC device 설정

Kernel의 Config 생성 및 설정 및 설치 (Module설정시 변경)

>make menuconfig
Device Drivers->MMC/SD Card support->   MMC support
                         [*]  MMC debugging
                           MMC block device driver  
                         [*]   Write work-around for incompatible cards
                         [*]   Multi-block writes (EXPERIMENTAL) 
                               < >  Winbond W83L51xD SD/MMC Card Interface support
                            < >  TI DAVINCI Multimedia Card Interface support
                               TI DM320 Multimedia Card In
> make modules
> make modules_install


상위와 같이 Kernel을 update 한 후 Board에서 SD Card를 삽입을 하고, SD Card의 Partition Table을 확인한 후 Device file을 확인.
Linux는 SD Card를 Hard disk처럼 인식하기 때문에, 반드시 SD Disk내에 Partition Table이 존재.


  • Partition Table 확인
> cat /proc/partitions
  254  0  249856 mmcblk0
  254  1  249805 mmcblk0p1

>ls /dev/mmcblk*   //device node 확인 
//만약 없다면, Device File 없다면,새로 생성
> # mknod /dev/mmcblk0 b 254 0
> # mknod /dev/mmcblk0p1 b 254 1

//만약 Partition Table이 존재 하지 않는다면, 다음과 같이 fdisk를 이용하여 만들어 준다.
> fdisk /dev/mmcblk0

//FileSystem이 없다면, FAT 혹은 EXT2,3를 Format 
>mkefs /dev/mmcblk0p1
or mkfs.ext2

>mount /dev/mmcblk0p1 /mnt/sd0

1.5 TI DM320 관련설정 부분



  • /mmc/dm320_mmc.c/init_clocks 함수 (clock 설정 , SDCard 와 SDIO는 25MHz/50MHz)



  • Clock Controller - INV Register 설정.





  • Clock Controller - DIV3 Register



  • MMC/SD Interface - MMCCLK Register



  • MMC/SD Interface 와 Memory Stick Controller




  • Clock Controller – MOD2




2. 다른 MMC/SD Driver 구조  (drivers/mmc )

MMC interface는 card or sdio 같은 소스를 사용하기에, 크게 수정할 일 없었으나,Host쪽 설정과 인식문제를 부분이 있어 이를 해결을 해야 할 것 같다.
(추후 시간이 있을 경우 최신것을 보도록 하자)

  • host    (이외 HOST, MCU에 의존적인 소스이며 설정소스 )
dw_mmc.c, sdhci.c sdhci-s3c.c

각 vendor에서 제공을 하며, MCU에 의존적으로 설정

  • card  ( block device driver) 
queue.c block.c mmc_block.o

sd card의 독립적인 모듈로 block device driver 구조로 각 thread queue를 사용하여 sd disk를 운영

  • core  ( sd card, mmc card, sdio  interface 및 기본 interface)
sd.c sdio.c mmc.c core.c bus.c ....

각 bus 및 interface 관련소스들로 구성이 되어있다. (SDIO 및 SD 기본 interface)

  • 관련 headers 
         include/linux/mmc


2.1 MMC/SD 관련 함수

  • Core interface 주요 함수 및 구조체 
drivers/mmc/core/core.h

  struct mmc_bus_ops {   // 각 sd, mmc, sdio bus function
    int (*awake)(struct mmc_host *);
    int (*sleep)(struct mmc_host *);
    void (*remove)(struct mmc_host *);
    void (*detect)(struct mmc_host *);
    int (*suspend)(struct mmc_host *);
    int (*resume)(struct mmc_host *);
    int (*power_save)(struct mmc_host *);
    int (*power_restore)(struct mmc_host *);

};

mmc_wait_for_cmd() 함수  // SD Interface Command 함수  , 이 함수를 이용하여 host에서 command를 보낸다.


  • Host interface 주요 함수 및 구조체 

 ex) const struct mmc_host_ops

static const struct mmc_host_ops sdhci_ops = {
  .request = sdhci_request, // SD Card  Block Device의 Request 함수
  .set_ios = sdhci_set_ios,
// Hardware Setting Init혹은 Voltage 설정. Bus width설정. Power 설정. Busmode
  .get_ro = sdhci_get_ro, //ReadOnly 지원할 경우
  .hw_reset = sdhci_hw_reset,
  .enable_sdio_irq = sdhci_enable_sdio_irq,
  .start_signal_voltage_switch = sdhci_start_signal_voltage_switch,
  .execute_tuning   = sdhci_execute_tuning,
  .enable_preset_value  = sdhci_enable_preset_value,
};


static struct platform_driver sdhci_s3c_driver = {
  .probe =sdhci_s3c_probe,   // mmc_alloc_host 이 호출되며, Device 인식 및 등록이 되므로 중요.
  .remove  = __devexit_p(sdhci_s3c_remove),
  .suspend = sdhci_s3c_suspend,
  .resume  = sdhci_s3c_resume,
  .driver  = {
  .owner   = THIS_MODULE,
  .name = "s3c-sdhci",
  },

};

  • Host interface의 Probe 함수 SD Interface 인식
mmc_alloc_host       (host_ops 의 probe 에서 mmc_alloc_host 호출)
  >mmc_rescan
    >mmc_rescan_try_freq
     >mmc_power_up
      >mmc_hw_reset_for_init
      >sdio_reset
      >mmc_attach_sdio   (3 중 하나로 mmc_bus_ops  등록 )
      or mmc_attach_sd
      or mmc_attach_mmc
      or mmc_power_off


2.2 MMC/SD Register 구조

SD는 CMD로 Host와 Device와 통신을 하며, 아래와 같이 Host에 Registers 존재하며,Device에 역시 이에 관련된 Register들이 존재한다. 이부분은 Spec을 참조.

  • SD Host Controller Register Map





  • SD Device Registers (SD Card)



위 Register는 SDIO 로 갈 경우 조금씩 달라지며,  각각의 최신 Spec를 참조.



  1. OCR: Card의 Voltage Status 및 High Capacity or Standard Capacity 인지를 나타낸다. (Response)
  2. CID: Card의 관련 제조사의 정보가 있다.
  3. CSD: Card의 핵심 레지스터 군들이 모두 이곳에 있다. (자세한 내용은 Spec)  (Read &Write Block size, Transfer Speed , etc )
  4. SCR: Card의 Data bus width, SD Spec Version, Security 지원여부를 나타낸다.
  5. RCA: Card의 Relative Card Address. (Host가 설정.)
  6. SSR: Card의 Status (Card의 설정된 정보 Card Type, Speed Class, Data bus width)
  7. CSR: Card의 Status (Card의 Error Check & Card의 State)