2014년 11월 11일 화요일

MangoM32 LED 제어

[출처]http://kjung.tistory.com/entry/719-ARM-LED-%EC%A0%9C%EC%96%B4

기본적으로  STM32T103 RBT6 칩이 달린 MANGO - M32 보드를 이용하여프로그램을 짠다.

일단 기본적으로 보드를 연결하기위해서는 

보드(당연히..) USB(전원용) 3pin포트(데이터를 다운로드하기위한..)
프로그램은 
보드에 프로그램을 쓰기위한
와 코드를짜기위한 EWARM-KS-WEB-5505.exe 프로그램 (www.iar.com여기서 받을수있다.)

이 필요하다.

위 두가지 프로그램이 준비되면 프로그램을 짜고 구동할수있다.

소스는 기본적으로 아트메가와 비슷하다.

 LED 제어
int main(void)
{
    // RCC APBPheri - GPIOB Enable
    (*(volatile unsigned *)0x40021018) |= 0x8;
    
    (*(volatile unsigned *)0x40010C00) |= 0x3<<20;
    (*(volatile unsigned *)0x40010C04) |= 0x33;
    
}





일단 LED를 제어하려면, PORTB에 연결된 5,8,9번 핀을 제어해야한다는것을 위 회로도를 보면 알수있다.

우선  ARM은 아트메가와는 달리 항상 포트를사용할땐 클럭주어 포트를 열어줘야한다.


위 그림을 보면 IOPBEN, 즉 POTB를 ENABLE 한다는 것이다.
이것을 1로 주게하려면, 4번째 자리. 즉,
    (*(volatile unsigned *)0x40021018) |= 0x8;
이렇게 주게되는것이다.
이렇게하여 포트를 열어준 뒤,
또 이번에는 PIN제어를 하겠다고 선언해 주어야한다. 즉,

위그림의 5번,8번,9번 이다.

즉 CRL의 20번쨰, CRH의 1~4번쨰 이다.

    (*(volatile unsigned *)0x40010C00) |= 0x3<<20;
    (*(volatile unsigned *)0x40010C04) |= 0x33;

왜 0x3일까..? 16진수는 2진수 4자리다. 즉, 0x3은 2진수로 0011 이다.
그렇다면 b0011은 왜넣는것일까?
그에 해답은 아래그림과 같다.


0011은 CNF 를 00, MODE 를 11로 한다는것이다.
이렇게하여 각핀마다 출력설정을 해주게되면 LED가 작동하게된다.
그렇다면 끄고 키는건 어떻게 해야할까?
PORTB를 살펴보자.

위 그림을 보게되면 BSRR과 BRR이 있다.
그런데 잘보면 BSRR에 BR도 있고 BSR도 있으며,
BRR에도 BR이 있다.

이것은 왜 그런것이냐면, 예전에는 BSRR 하나로 BR과 BSR을 동시에 작동시켯으며, 지금은 두개로 나눠저서 그렇다.

이말은 무슨말이냐고 하면, 아트메가와는 달리 0이면 켜지고 1이면 꺼지는 것이 아니라,

BSS의 PIN 1 에 1을 넣으면 1번 핀이 작동하고, BSRR의 PIN 1에 1을 넣으면 1번핀이 꺼지게된다.

즉, 내부적으로 BSS가 0을, BSRR이 1을 넣어준다고 생각하면 된다.

이렇게 값을 넣어 작동을 시키면 R G Y 색들을 순서대로 점등시키기 등을 할수 있을 것이다.

저작자 표시

'--------------------- > ARM' 카테고리의 다른 글

7/21 ARM FND 제어  (0)2010/07/21
7/19 ARM LED 제어  (0)2010/07/19
Posted by 김진웅
0 | 0
  12  

Quick Start Guide zFrog IoT Thing Board (CR-IOT-AT100)

2014년 11월 10일 월요일

Mango520 SPI 테스트



  1. 커널 수정



$ ./build_kernel config



    1. build_kernel 수정하기


$ vi build_kernel

make -j$CPU_JOB_NUM 2>&1 | tee build.out
수정합니다.
그리고, { 과 #} 2>&1 | tee build.out 부분은 막습니다.
그래야 ./build_kernel config 가 됩니다.

#{
CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+2}')
START_TIME=`date +%s`
#sudo apt-get install libncurses5-dev

case "$1" in
clean)
   echo make -j$CPU_JOB_NUM mrproper
#    cp .config arch/arm/configs/$KERNEL_CONFIG
#    cp .config config.sav
   rm -f build.out
   make -j$CPU_JOB_NUM mrproper
   ;;
config)
   echo make -j$CPU_JOB_NUM menuconfig
   sudo apt-get install libncurses5-dev
   make menuconfig
   ;;
defconfig)
   if [ "$2" ] ; then
       KERNEL_CONFIG=$2
   fi
   echo make -j$CPU_JOB_NUM $KERNEL_CONFIG
   make -j$CPU_JOB_NUM $KERNEL_CONFIG
   ;;
all|*)
   echo make -j$CPU_JOB_NUM
   make -j$CPU_JOB_NUM 2>&1 | tee build.out
   if [ $? != 0 ] ; then
           exit 1
   fi
   if [ "$2" ] ; then
       INSTALL_BINDIR=$2
   fi
   if [ $INSTALL_BINDIR ] ; then
       echo cp -a arch/arm/boot/$KERNEL_IMAGE $INSTALL_BINDIR/$KERNEL_IMAGE
       cp -a arch/arm/boot/$KERNEL_IMAGE $INSTALL_BINDIR/$KERNEL_IMAGE
   fi
   if [ $INSTALL_BINDIR2 ] ; then
       echo cp -a arch/arm/boot/$KERNEL_IMAGE $INSTALL_BINDIR2/$KERNEL_IMAGE
       cp -a arch/arm/boot/$KERNEL_IMAGE $INSTALL_BINDIR2/$KERNEL_IMAGE
   fi

   ;;
esac

END_TIME=`date +%s`
echo "Total compile time is $((($END_TIME-$START_TIME)/60)) minutes $((($END_TIME-$START_TIME)%60)) seconds"
#} 2>&1 | tee build.out


    1. 커널 spi config 하기



$  ./build_kernel defconfig
$ ./build_kernel config





Device Drivers  --->
[*] SPI support  --->
<*>   User mode SPI device driver support

Config를 하고 커널을 컴파일 합니다.

$ ./build_kernel


    1. How to write kernel image



이미지를 Write를 합니다.

보드에 3Pin Serial Cable, Mini USB cable, 어댑터를 연결합니다.
전원 스위치를 ON합니다.
터미널 프로그램을 실행을 합니다.

u-boot가 실행이 되면, Anykey를 누른 후 u-boot 프롬프트 창으로 이동합니다.

U-Boot 2012.07 (Nov 05 2014 - 19:17:27) for SMDK5250

CPU:    Exynos5250@1000MHz

Board: SMDK5250
DRAM:  2 GiB
WARNING: Caches not enabled

Checking Boot Mode ... SDMMC
MMC:
READ MMC4 CON REG = 0x2222222
READ MMC4 PUD REG = 0x3ff0
READ MMC4 DRV REG = 0x3fff
S5P_MSHC2: 0, S5P_MSHC0: 1
MMC Device 0: EEEEEEEEEEEEEEEEEEEEEXT write OK!! : 0
7.4 GiB
MMC Device 1: [ERROR] response timeout error : 00000104 cmd 1
Card did not respond to voltage select!
In:    serial
Out:   serial
Err:   serial
Net:   smc911x-0
Hit any key to stop autoboot:  0
SMDK5250 #
SMDK5250 #
SMDK5250 # fast
Error: No MBR is found at SD/MMC.
Hint: use fdisk command to make partitions.
SMDK5250 # dnw 41000000;movi write kernel 0 41000000


dnw 41000000;movi write kernel 0 41000000

명령을 실행합니다.

리눅스 PC에서 linux sdtool download

$ cd image
$ sudo smdk-usbdl -f zImage -a 41000000

수행 결과

$ sudo smdk-usbdl -f zImage -a 41000000
SMDK42XX,S3C64XX USB Download Tool
Version 0.20 (c) 2004,2005,2006 Ben Dooks <ben-linux@fluff.org>

S3C64XX Detected!
=> found device: bus 002, dev 005
=> loaded 5048984 bytes from zImage
=> Downloading 5048994 bytes to 0x41000000
=> Data checksum 39e1
=> usb_bulk_write() returned 5048994

망고 보드에 kernel 이미지가 Write가 됩니다.


SMDK5250 # dnw 41000000;movi write kernel 0 41000000
CRZ readl(USB_PHY_CONTROL)=0x1
CRZ readl(USB_PHY_CONTROL-0x04)=0x0
OTG cable Connected!
       [CRZ]: ucMode = 0x0
Now, Waiting for DNW to transmit data
Checksum is being calculated.....
Checksum O.K.
Download Done!! Download Address: 0x41000000, Download Filesize:0x4d0a98
fwbl1: 1
bl2: 17
u-boot: 49
TrustZone S/W: 1073
env: 1073
knl: 4096
rfs: 14336
writing kernel..device 0 Start 4096, Count 10240
MMC write: dev # 0, block # 4096, count 10240 ... 10240 blocks write: OK
completed



  1. SPI Test 어플 실행하기  

부팅 후

~]# ls -al /dev/spidev*
crw------- 1 root root 153, 0 Jan  1 00:42 /dev/spidev0.0
crw------- 1 root root 153, 1 Jan  1 00:42 /dev/spidev2.0

확인이 됩니다.  소스를 살펴보면, MAJOR 번호는 동일합니다.

drivers/spi/spidev.c:#define SPIDEV_MAJOR                       153     /* assigned */

간단하게 살펴 보면, "drivers/spi/spidev.c" 파일에서

dev = device_create(spidev_class, &spi->dev, spidev->devt,
                                   spidev, "spidev%d.%d",
                                   spi->master->bus_num, spi->chip_select);

위 코드에서 device node에 “spidev2.0” 의 의미는 2는 bus number이고, 0은 chip select 입니다.


    1. Test 어플 컴파일 하기


Toolchain은
을 사용합니다.

테스트 어플 소스는 커널 소스에 포함이 되어 있습니다.



$ cd Documentation/spi/
spidev_test.c

컴파일 방법

Cross-compile with cross-gcc -I/path/to/cross-kernel/include


$ /opt/arm-2009q3/bin/arm-none-linux-gnueabi-gcc -o spidev_test spidev_test.c -I../../include -I../../arch/arm/include
In file included from ../../arch/arm/include/asm/types.h:4,
                from ../../include/linux/types.h:4,
                from spidev_test.c:21:
../../include/asm-generic/int-ll64.h:11: fatal error: asm/bitsperlong.h: No such file or directory
compilation terminated.

위와 같이 에러가 발생하는 경우
아래와 같이 수정합니다.

$ cd include/
$nclude]$ ln -s asm-generic asm

컴파일은

$ cd ../Documentation/spi/
$ /opt/arm-2009q3/bin/arm-none-linux-gnueabi-gcc -o spidev_test spidev_test.c -I../../include

“spidev_test.c 파일에서

수정을 합니다.

static const char *device = "/dev/spidev0.0";


    1. Spidev_test 어플 실행하기



컴파일 된 spidev_test 파일을 파일 시스템에 복사를 합니다.
mSD 카드를 PC에 삽입합니다.

$ mkdir rootfs
$ sudo mount /dev/sdh2 ./rootfs
$ sudo cp spidev_test ./rootfs/root/
$ sync
$ sudo umount ./rootfs



mSD 카드를 보드에 삽입합니다.

부팅을 하면,

# ls
nfs_mount/  nfs_mount.sh*  nfs_umount.sh*  spidev_test*

Spidev_test파일이 있습니다.
실행결과("/dev/spidev0.0

# ./spidev_test
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00

실행결과("/dev/spidev2.0”



# ./spidev_test
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF