커널 수정
$ ./build_kernel config
|
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
|
커널 spi config 하기
$ ./build_kernel defconfig
$ ./build_kernel config
|
Device Drivers --->
[*] SPI support --->
<*> User mode SPI device driver support
|
Config를 하고 커널을 컴파일 합니다.
$ ./build_kernel
|
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
|
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 입니다.
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";
|
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
|
댓글 없음:
댓글 쓰기