2010년 10월 14일 목요일

specification of my machine

* slide switch

- http://www.syswitch.com/zboard.php?id=product&page=1&sn1=&divpage=1&category=6&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=26

- http://www.djswitch.co.kr/product/k_product_slide_detail.asp?c3_code=130208

- 코원 D2에 쓰인 슬라이드 버튼이다. 원래 기존의 슬라이드 버튼에 스프링이 달려 있어서 장력이 발생한다. 사용하기 무지하게 편하고 개발자가 고려해야할 버튼 상태에 제약을 주어서 개발에 용이하다. 전원과 홀드 스위치에 고려해 볼만하다.

* joystick nevigator

- Thumb joystick http://www.sparkfun.com/commerce/product_info.php?products_id=9032

- 두가지 종류의 조이스틱이 판매되고 있는데 다른것들은 다 동일하고 가운에 누름 버튼이 추가된것과 아닌것이 존재한다. mp3의 경우 L:이전, R:다음, U:크게, D:작게, 동작(멈춤)으로 구성하면 딱인거 같다.

* trackballer

- http://www.sparkfun.com/commerce/product_info.php?products_id=9320

- 이건 그냥 관련이 없지만 사용해 보고 싶어서 넣어 두었다. 그냥 허영이다. 엔지니어의 허영....

2010년 10월 13일 수요일

[작업중] Tesseract 3.0 해석

1. TesseractRect(const unsigned char *imagedata, int byte_per_pixel, int bytes_per_line, int left, int top, int width, int height);

1.1. 유의 사항

- 단독으로 사용가능하고, 24bits, 8bits, 32bits, 1 bit를 갖는 화소에 모두 적용 가능하지만, pallete를 참조하는 방식의 8bits 화소에 대해서는 적용이 불가능함.

- 1bit 화소에 대해서 첫번째 바이트의 MSB가 첫번째 화소값이 되도록 즉 littel endian으로 되어 있음. (이거 전면 수정해야 할것 같음. 아니면 옵션을 주던가.) imagedata가 바이트 단위로 padding되어 있어야 함( 내 것은 4byte 단위로 padding 되어 있다). 그리고 bytes_per_pixel = 0 으로 되어 있어야 함.

- 좀더 세세한 사항은 SetImage, SetRectangle, Recognize, 와 Get*Text라는 함수를 좀더 들여다 보자.

1.2. 기능

- 영상에서 네모 영역을 인식하고 문자열을 되돌려 준다.

2. SetImage(const unsigned char *imagedata, int width, int height, int bytes_per_pixel, int bytes_per_line)

2.1. 주의 사항

- Tesseract가 Recoginize을 하기 위한 이미지 버퍼를 복사하지 않고 참조하기 위한 설정을 한다.

- imagedata는 Recognize를 수행한 후 메모리 반환될 것이다.

2010년 10월 10일 일요일

new scheme

* Helix's mp3-decoder in Thumb2 mode
* LPC1768 breakout board
- Kicad's library
- design footprint
* Purchase LPC1768 from ICBANK.COM
* DAC board


2010년 10월 4일 월요일

arm inline assembly using gcc

__arm__ __volatile__ ( asms : output : input : clubber );
__arm__ __volatile__ ( asms : output : input );
__arm__ __volatile__ ( asms : output : : clubber );

* asms내의 모든 명령어는 " "사이에 있어야 한다.
* asms내의 명령어 간의 구분은 ;이나 \n으로 구분한다.
* output에서 시작해 input으로 오퍼랜드가 %0, %1, ...등등으로 매겨진다.
* ouput, input 변수들은 constraints와 변수명이 쉼표로 구분되어 있다.
- "=" : 오퍼랜드가 쓰기 전용
- "r" : 일반 레지스터 사용 오퍼랜드
- "&" : earlyclobber 오퍼랜드를 나타내고 input오퍼랜드를 사용하는 명령이 끝나기 전에 변경된다는 것을 의미한다. 그래서 input오퍼랜드나 메모리 어드레스의 일부를 나타내는 레지스터엔 못쓴다. gcc는 input변수가 다 사용되고 나면 output에 사용된다고 가정하기 때문에 input에 사용된 변수가 output과 같게 되고 또 output이 input보다 먼저 사용되는 경우가 발생할 수 있다. 이런 경우를 막기 위해 output에 사용된 변수가 input이 모두 사용되기 전에 변경될 수도 있다고 알려줘야만 input과 output이 같아져 생기는 에러를 막을 수 있다.

필요한 일들

* mp3 decoder를 arm모드에서 thumb2모드로 변경하는 작업
* tesseract를 잘게 쪼개서 덩치를 줄이는 작업
- leptonica라고 하는 예전에 이미지 회전을 구현할때 참고했던 라이브러리의 바탕을 전부 차용하고 있다.
- 가장 큰 그림을 그릴 수 있게 해주는 파일은 api 디렉토리 밑에 있다. baseapi.cpp 와 tesseractmain.cpp을 분석하면 모든게 해결 될것 같다. 아마도...
- tesseract 라이브러리를 개략적으로 분석한 paper도 존재한다. 읽어 보도록 하자. http://tesseract-ocr.repairfaq.org/downloads/tesseract_overview.pdf
- http://tesseract-ocr.repairfaq.org/ 참고하자. v0.04 기반의 c/c++의 코드 분석에 관한 내용
- http://ieeexplore.ieee.org/iel5/4376968/4376969/04376991.pdf?tp=&isnumber=4376969
&arnumber=4376991 관련 논문

2010년 10월 3일 일요일

change a boot logo in linux kernel

* Drawing a new boot logo by image tool such a GIMP.
* Install "ppmquant" by
# sudo apt-get install netpbm
* Make the image with the depth of colors is below 224
# ppmquant 224 "logofile" > "newlogofile"
* Make the image with plain text
# pnmnoraw "newlogofile" > logo_linux_clut224.ppm
* copy logo_linux_clut224.ppm to "drivers/video/logo"

2010년 9월 30일 목요일

ADC2USB diagram


created by google's docs

2010년 9월 26일 일요일

Working note to replace booting logo of android

At init.c under system/core/init

* remove text logo

#if BOOTLOGO
if( logo_565rle_image(INIT_IMAGE_FILE) ) {
#endif
+#if 0
fd = open("/dev/tty0", O_WRONLY);
if (fd >= 0) {
#if 1 /* 0xlab flavor */
#include "text_0xlab.h"
#else
const char *msg;
msg = "\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n" // consol is 40 cols x 30 lines
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
"\n"
" ANDROID ";
#endif
write(fd, msg, strlen(msg));
close(fd);
}
+#endif

* create new boot logo image with "rle" extension; means run length encoding
create new "bmp" image file with 24bits true color
convert "bmp" file using "rgb2565" under "out/host/linux-x86/bin"; #./rgb2565 -rle < "bmp" > initlogo.rle
replace initlogo.rle under "vender/0xlab/devkit8000/initlogo.rle"

Useful commands or tools in linux system

1. goto 'n' line in vi command mode; 'n' G
2. using grep , find text 'string' recursively under 'directory'; grep -r 'string' 'directory'
3. find file named "wannabe" under "directory"; find "directory" -name "wannabe" -print

2010년 9월 20일 월요일

internal flash write (stm32f103)

#define FLASH_PAGE_SIZE ((uint16_t)0x400)
//#define BANK1_WRITE_START_ADDR ((uint32_t)0x08008000)
//#define BANK1_WRITE_END_ADDR ((uint32_t)0x0800C000)

// Middle density
// Page 127 (0x0801FC00 ~ 0x0801FFFF : 1kbyte)
#define PAGE_START_ADDR ((uint32_t)0x0801FC00)
#define PAGE_END_ADDR ((uint32_t)0x08020000)

#if 0
// High density
// Page 127 (0x0803F800 ~ 0x0802FFFF : 2kbyte)
#define PAGE_START_ADDR ((uint32_t)0x0803F800)
#define PAGE_END_ADDR ((uint32_t)0x08030000)
#endif

void save_env(void)
{
   uint32_t Address = 0x00;
   uint32_t Data = 0x3210ABCD;
   volatile FLASH_Status FLASHStatus = FLASH_COMPLETE;

   /* Porgram FLASH Bank1 ********************************************************/
   /* Unlock the Flash Bank1 Program Erase controller */
   FLASH_UnlockBank1();

   /* Clear All pending flags */
   FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);

   /* Erase the FLASH pages */
   FLASHStatus = FLASH_ErasePage(PAGE_START_ADDR);
   if (FLASHStatus != FLASH_COMPLETE) return;

   /* Program Flash Bank1 */
   Address = PAGE_START_ADDR;
   while ((Address < PAGE_END_ADDR) && (FLASHStatus == FLASH_COMPLETE)) {
      FLASHStatus = FLASH_ProgramWord(Address, Data);
      Address = Address + 4;
   }

   FLASH_LockBank1();
}

template of assembly function for cortex M3 (thumb2)

/*;*******************************************************************************
;* Function Name : void c_func(void *out, void *in, uint16_t n)
;* Description : linkable function with C language
;* Input : - R0 = out:
;* - R1 = in:
;* - R2 = n:
;* Output : None
;* Return : None
;********************************************************************************/

.cpu cortex-m3
.fpu softvfp
.syntax unified
.thumb
.text

.global c_func

;* #define N 64

.equ N, 64

.thumb_func
c_func:

STMFD SP!, {R4-R11, LR}
;* operation
LDRSR rx, [ry, #+0]
SUBS rx, ry, #+1 /* decrement */
MUL rz, rx, ry
MLA r4, r5, r4, r6
;* end of operation
LDMFD SP!, {R4-R11, PC}
BX LR /* return */
.end

2010년 8월 25일 수요일

다음 문장에서 의미하는 정확한 의미는 ?

"나는 거짓말은 안하자만 숨기는 것은 있어?"
1. 비의도적인 신사
2. 의도적인 거짓말쟁이
3. 방어적 현실주의자
4. 낙천주의자
5. 외계인
5. 기타 등등

2010년 8월 23일 월요일

Compilation of FreeType Library for My STM32F10x Embedded System under Windows system

1. download freetype library

2. extract to $(freetype_dir)

3. create a new file named "config.mk" containing the below under $(freetype_dir)

#
# FreeType 2 configuration rules
#


# This file is part of the FreeType project, and may only be used, modified,
# and distributed under the terms of the FreeType project license,
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
# indicate that you have read the license and understand and accept it
# fully.


include $(TOP_DIR)/builds/gcc-cross/gcc-cross-def.mk
include $(TOP_DIR)/builds/compiler/gcc-cross.mk
include $(TOP_DIR)/builds/link_std.mk


# EOF

4. create new directory named "gcc-cross" under $(freetyep_dir)/buils

5. create new file named "gcc-cross-def.mk" containing the below under /builds/gcc-cross/

#
# FreeType 2 configuration rules
#


# This file is part of the FreeType project, and may only be used, modified,
# and distributed under the terms of the FreeType project license,
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
# indicate that you have read the license and understand and accept it
# fully.


DELETE := rm -f
CAT := cat
SEP := /
BUILD_DIR := $(TOP_DIR)/builds/gcc-cross
PLATFORM := gcc-cross


# The directory where all library files are placed.
#
# By default, this is the same as $(OBJ_DIR); however, this can be changed
# to suit particular needs.
#
LIB_DIR := $(OBJ_DIR)


# The name of the final library file. Note that the DOS-specific Makefile
# uses a shorter (8.3) name.
#
LIBRARY := lib$(PROJECT)


# Path inclusion flag. Some compilers use a different flag than `-I' to
# specify an additional include path. Examples are `/i=' or `-J'.
#
I := -I


# C flag used to define a macro before the compilation of a given source
# object. Usually it is `-D' like in `-DDEBUG'.
#
D := -D


# The link flag used to specify a given library file on link. Note that
# this is only used to compile the demo programs, not the library itself.
#
L := -l


# Target flag.
#
T := -o$(space)


# C flags
#
# These should concern: debug output, optimization & warnings.
#
# Use the ANSIFLAGS variable to define the compiler flags used to enfore
# ANSI compliance.
#
CFLAGS ?= -c -O2 -mthumb -mthumb-interwork -mcpu=cortex-m3 -D__thumb__

# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
#
ANSIFLAGS :=


# EOF

6. create new file named "gcc-cross.mk" containing the below under $(freetype_dir)/builds/compiler

#
# FreeType 2 gcc-specific definitions
#


# Copyright 1996-2000, 2003, 2005, 2006, 2009 by
# David Turner, Robert Wilhelm, and Werner Lemberg.
#
# This file is part of the FreeType project, and may only be used, modified,
# and distributed under the terms of the FreeType project license,
# LICENSE.TXT. By continuing to use, modify, or distribute this file you
# indicate that you have read the license and understand and accept it
# fully.


# Compiler command line name
#
CROSS := "C:/Program Files/CodeSourcery/Sourcery G++ Lite/bin/arm-none-eabi-"
CC := $(CROSS)gcc
COMPILER_SEP := /


# The object file extension (for standard and static libraries). This can be
# .o, .tco, .obj, etc., depending on the platform.
#
O := o
SO := o

# The library file extension (for standard and static libraries). This can
# be .a, .lib, etc., depending on the platform.
#
A := a
SA := a


# Path inclusion flag. Some compilers use a different flag than `-I' to
# specify an additional include path. Examples are `/i=' or `-J'.
#
I := -I


# C flag used to define a macro before the compilation of a given source
# object. Usually it is `-D' like in `-DDEBUG'.
#
D := -D


# The link flag used to specify a given library file on link. Note that
# this is only used to compile the demo programs, not the library itself.
#
L := -l


# Target flag.
#
T := -o$(space)

# C flags
#
# These should concern: debug output, optimization & warnings.
#
# Use the ANSIFLAGS variable to define the compiler flags used to enfore
# ANSI compliance.
#

CFLAGS ?= -c -O2 -Wall -mthumb -mthumb-interwork -mcpu=cortex-m3 -D__thumb__

# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
#
ANSIFLAGS := -ansi -pedantic


# Library linking
#
CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY))
AR := $(CROSS)ar
LINK_LIBRARY = $(AR) -r $@ $(OBJECTS_LIST)


# EOF

7. finally, compile it to hit "make" and see $(freetype_dir)/docs/CUSTOMIZE to remove unuseable modules and modify $(freetype_dir)/modules.cfg.

2010년 8월 19일 목요일

install blackfin toolchain from debian package

$ sudo su
# mkdir -p /etc/apt/sources.list.d
# echo deb http://download.analog.com/27516/distros/debian stable main > /etc/apt/sources.list.d/blackfin.sources.list
$ sudo apt-get update
$ sudo apt-get install blackfin-toolchain-uclinux blackfin-toolchain-linux-uclibc

2010년 8월 6일 금요일

Debian 설치와 X11 configuration

데비안 설치후 X window로의 로그인이 불가능하여 ati 그래픽 카드 드라이버인 fglrx를 설치하고 그놈을 다시 설치하고 해도 불능이었다. 결국 되돌아 갈 수 없는 상황이 되어 버렸다. 어짜피 다시 설치하고 해야 하기 때문에 그냥 우분투로 되돌아 갈까 하는 생각이 들었지만 한번 더 해보기로 하고 데비안 설치와 -> X window의 불능 -> single-user mode로의 부팅 -> Xorg -configure -> X -config /root/xorg.conf.new 인 상황인데 예상했다 시피 불능이다. 그래서 찾아 보았다. 데비안이 아닌 freebsd 핸드북에서 찾은거 같다 내 상황이랑 비슷하게 보여진다. 우선 번역해가면서 차근차근 읽어 보도록 해야겠다.

X11 설정 :
우선 xorg.conf.new를 수정해 나아 갔다. 맨 아래의 X11 설정에 대한 내용을 토대로 Monitor 섹션에 ModeLine을 /var/log/Xorg.0.log파일을 보면서 설정해 놓고 Screen 섹션에서 "1024x768"로 해상도를 설정해 놓았다. 물론 지금은 그냥 X window가 뜨는 정도에서 만족한다. 나중에 VESA 드라이버인 상태를 ATI R710 드라이버인 fglrx로 변경하는 작업을 해야만 할 것 같다. 해상도와 속도가 너무 답답하다.

출처 : http://www.freebsd.org/doc/handbook/x-config.html

5.4 X11 설정
Contributed by christopher Shumway.

5.4.1. 시작하기전에
X11을 설정하기전에 해당 시스템에 대한 다음 사항들이 필요하다.
  • 모니터의 성능 명세
  • 비디오 아답터의 칩셋 정보
  • 비디오 아답터의 메모리 크기
모니터의 성능 명세사항은 실행시 주사율과 해상도를 결정하기 위해서 X11에 의해서 사용되어 진다. 이러한 명세 사항들은 보통 모니터에 딸려오는 문서나 제조사의 홈페이지에서 구할 수 있다. 필요로 하는 것은 2개의 숫자 범위이다. Horizontal scan rate와 Vertical synchronization rate이다.

비디오 아답터의 칩셋은 X11이 비디오 하드웨어와 소통하는데 사용하는 드라이버 모듈이 무엇인가를 정의한다. 대부분의 칩셋에서는 자동적으로 결정되어 질 수 있다. 하지만, 자동 인식이 제대로 작동하지 못하는 경우에는 여전히 알아두는 것이 유용하다.

비디오 아답터에 있는 비디오 메모리는 시스템이 구동 될 수 있는 해상도와 컬러 심도를 결정한다. 사용자가 시스템의 한계를 알아야 하기 때문에 알아두는 것이 중요하다.

5.4.2 X11 설정
버전 7.3이후로 Xorg는 명령행에 단순히 치는 것만으로 어떤 설정 파일없이 자주 실행 되곤 한다.

% startx

버전 7.4를 시작으로 Xorg는 키보드와 마우스를 자동인식하는데 HAL을 사용할 수 있다. sysutils/hal과 devel/dbus 포트는 x11/xorg의 의존적인 것으로 설치된다. 그러나 etc/rc.conf 파일에 다음 사항들을 활성화 되어져야만 한다.

hald_enabled="YES"
dbus_enabled="YES"

이러한 서비스들은 X11 설정을 좀더 진행하기 이전에 시작되어져야만 한다. ( 수동으로 시작하던가 reboot를 통해서 하던가)
자동 인식은 어떤하드웨어에서는 작동이 실패할지도 모르고, 원하던대로 정확히 설정되지 안을 수도 있다. 이러한 상황에서는 수동적인 설정이 필요하게 된다.

Note. GNOME, KDE, Xfce 같은 데스크탑 환경은 사용자가 해상도같은 스크린 파라미터를 쉽게 설정할 수 있도록 허용하는 툴들을 가지고 있다. 기본 설정이 말을 듣지않고 데스크탑환경을 설치하기 원한다면, 데스크탑환경을 계속 설치하고 적절한 스크린 셋팅 도구를 사용하자.

X11의 설정은 수많은 단계의 절차이다. 첫번째는 초기화 설정 파일을 만드는 것이다. 수펴유저로써 단순히 실행하자.

# Xorg -configure

root 디렉토리에 xorg.conf.new라고 불리는 X11설정 뼈대 파일을 생성할 것이다. (su명령어를 사용하거나, 직접 로그인 은 상속받은 슈퍼유저의 $HOME이라는 디렉토리 변수에 영향을 받는다.) X11 프로그램은 시스템의 그래픽 하드웨어를 점검하고 해당 시스템의 인식된 하드웨어를 위한 적절한 드라이버를 로드하는 설정파일을 작성할 것이다.

다음 단계는 Xorg가 해당 시스템의 그래픽 하드웨어와 동작할 수 있는지를 점검하기 위해서 작성된 설정파일을 테스트한다. 버전 7.3 이후의 Xorg에서 다음과 같이 쳐넣자.

# Xorg -config xorg.conf.new

7.4 버전이후의 Xorg를 시작으로 이러한 테스트는 X11이 적절히 작동하는지를 검사하기를 어렵게 만드는 검은 화면을 생성한다. 좀 오래된 방식은 retro 옵션을 사용함으로써 여전히 유효하다.

# Xorg -config xorg.conf.new -retro

검고 회색의 grid라인과 X 마우스 커서가 나타난다면 설정은 성공적인 것이다. 테스트를 빠져 나가기 위해선 가상 콘솔로 전환하도록 Ctrl+Alt+Fn을 사용하고 Ctrl+C를 누르자.

Note. 7.3 이후의 Xorg에서는 Ctrl+Alt+Backspace 키 조합은 Xorg를 빠져나가는데 사용되어 질 수 있다. 7.4 이후의 버전에서 이것을 활성화 하기 위해선 X 터미널 에뮬레이터에서 다음 명령을 수행하면 된다.

% setxkbmap -option terminate:ctrl_alt_bksp

혹은x11-input.fdi이라는 hald를 위한 키보드 설정 파일을 만들고 /usr/local/etc/hal/fdi/option 디렉토리에 저장하자. 이파일은 다음의 라인들을 포함한다.





terminate:ctrl_alt_bksp


여러분은 hald가 이파일을 읽도록 시스템을 재부팅 해주어야만 할 것이다.

다음 라인 또한 xorg.conf.new의 ServerLayout이나 ServerFlags 섹션에 추가되어져야만 할것이다.

Option "DontZap" "off"



마우스가 적절히 작동하지 않는다면, 진행하기 이전에 첫번재 설정을 다시 할 필요가 있다. FreeBSD 설치 장에 섹션 2.10.10을 보라. 추가적으로 7.4버전으로 시작한다면 xorg.conf의 InputDevice 섹션들은 자동인식된 디바이스들의 도움으로 무시된다. 이전의 동작을 복구하기 위해선 이 파일의 ServerLayout이나 ServerFlags 섹션에 다음 라인을 추가하자.

Option "AutoAddDevices" "false"

입력 장치들은 필요로 하는 어떤 다른 옵션(keyboard layout switching같은)들을 가지고 이전 버전에서 설정된 대로 될 것이다.

Note. 7.4버전 때문에 이전에 설명한 대로, 기본적으로 hald 데몬은 여러분의 키보드를 자동적으로 인식할 것이다. 간혹 여러분의 키보드의 배치와 모델이 잘못 되어 있을 수도있다. GNOME, KDE, Xfce같은 데스크탑 환경은 키보드를 설정하는 도구들을 제공한다. 그러나, setxkbmap이나 hald의 설정 파일의 도움으로 직접적으로 키보드의 명세를 설정할 수 있다.

예를 들면 프랑스 자판 배열 가지는 PC 102 키의 키보드를 사용하기 원한다면, x11-input.fdi라고 부르는 hald를 위한 키보드 설정파일을 만들고, /usr/local/etc/hal/fdi/policy 디렉토리에 저장하자. 이 파일의 내용은 다음과 같다.





pc102
fr


이 파일이 이미 존재한다면, 복사해서 키보드 설정에 관련된 라인에 추가하자.

여러분은 hald가 이 파일을 읽도록 여러분의 컴퓨터를 재부팅해야만 한다.

동일한 설정은 X 터미널이나 명령행을 갖는 script를 실행함으로써 가능하다.

% setxkbmap -model pc102 -layout fr

/usr/local/share/X11/xkb/rules/base.lst 파일은 다양한 키보드와 자판 배열 그리고 유용한 옵션들을 나열하고 있다.


다음은, xorg.conf.new파일을 맛보기위한 튜닝이다. emacs나 ee같은 문서 편집기를 열고, 먼저 해당 시스템의 모니터에 대한 주파수 정보를 추가하자. 이것들은 보통 horizontal, vertical synchronization rate로 표현된다. 이 값들은 xorg.conf.new파일의 Monitor섹션 밑에 추가하자.

Section "Monitor"
Identifier "Monitor0"
VendorName "Monitor Vendor"
ModelName "Monitor Model"
HorizSync 30-107
VertRefresh 48-120
EndSection

HorizSync와 VertRefresh 키워드는 설정파일에서 사라져 있을 것이다. 그렇다면 그들을 HorizSync 키워드 이후에 정확한 horizontal synchronization rate와 VertRefresh 키워드 이후에 vertical synchronization rate를 갖도록 추가할 필요가 있다. 예를 들면 해당 모니터의 주사율이 들어 가게된다.

X는 사용하는 모니터와 함께 사용되어지는 DPMS(Energy Star) 기능들을 허용한다. xset 프로그램은 time-out을 설정하고 standby, suspend, 와 off 모드를 전환할 수 있다. 모니터를 위해 DPMS를 활성화히기 원한다면, 모니터 섹션에 다음 라인을 추가해야만 한다.

Option "DPMS"

xorg.conf.new 설정파일을 여전히 에디터에서 열어 두면서, 기본 해상도와 컬러 심도를 선택하자. 이것은 Screen 섹션에 정의 되어 있다.

Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
DefaultDepth 24
SubSection "Display"
Viewport 0 0
Depth 24
Modes "1024x768"
EndSubSection
EndSection

DefaultDepth 키워드는 기본적으로 동작하는 컬러 심도를 설명한다. 이것은 -depth 라는 명령행을 Xorg에 넘겨서 실행 될 수도 있다. Modes 키워드는 추어진 컬러 심도에서 실행하게 될 해상도를 설명한다. Note 단지 VESA 표준 모드들만 해당 시스템의 그래픽 하드웨에 의해서 정의 됨으로 지원된다. 위에서 예를 든대로, 기본 컬러 심도는 24bits per pixel이다. 이 컬러 심도에서 허용하는 해상도는 1024 by 768 pixels이다.

마지막으로 설정 파일을 쓰고 위에서 주어진 테스트 모드를 사용하도록 테스 하자.

Note: 문제가 발생하는 과정동안 여러분을 도와줄 수 있는 유용한 도구중 하나는 X11 log files이다. 이것은 X11 서버에 달려 있는 각 디바이스의 정보들을 가지고 있다. Xorg 로그 파일 이름들은 /var/log/Xorg.0.log의 포멧으로 되어 있다. 로그의 정확한 이름은 Xorg.0.log에서 Xorg.8.log까지 다양하다.

모든 것이 잘된다면, 설정 파일을 Xorg가 찾을 수 있는 공동 위치에 저장해야할 필요가 있다. 이곳은 아마도 /etc/X11/xorg.conf/ 이거나 /usr/local/etc/X11/xorg.conf일 것이다.

# cp xorg.conf.new /etc/X11/xorg.conf

X11 설정 과정은 이제 완료 되었다. Xorg는 startx 유틸리티로 지금 시작되어 질 수 있다. X11 서버는 xdm을 사용해서 사용되어 질 수 있다.

5.4.3 진보된 설정 항목들

5.4.3.1. Intel i810 그래픽 칩셋으로 설정
인텔 i810이 탑제된 칩셋을 가진 설정은 X11가 카드를 운용할 수 있도록 하기 위해서 agpgart AGP 프로그래밍 인터페이스를 요구한다. 좀 더 많은 정보를 위해선 agp 드라이버 메뉴얼 페이지를 보라.

이거은 어떤 다른 그래픽 보드로서의 하드웨어의 설정을 할 수 있도록 도와 줄 것이다. Note 커널에 agp 드라이버가 없는 시스템에서는 kldload가 작동하지 않는 모듈을 로드 하도록 시도해 보자. 이 드라이버는 컴파일이나 /boot/loader.conf를 사용함으로써 부팅 시점에 커널에 존재해야만 한다.

5.4.3.2 와이드 스크린 Flatpanel을 Mix에 추가하기
이 섹션은 좀 전문적인 설정 지식을 필요로 한다. 설정의 동작이 안되며, 위의 표준 설정 도구들을사용하기 시도 한다면, 설정 작업을 하는데 log 파일은 충분한 정보를 가지고 있다.

현재 와이드 스크린(WSXGA, WSXGA+, WUXGA, WXGA, WXGA+ 등등) 포멧은 16:10과 10:9형식을 지원하거나 문제를 읽으 킬 수 있는 비율을 지원한다. 예를 들면 16:10의 비율이 지원하는 공통 화면 해상도는

  • 2050x1600
  • 1920x1200
  • 1680x1050
  • 1440x900
  • 1280x800
어떤 점에서 Screen 섹션에 다음과 같이 이들 해상도 중 하나를 넣는 것 만큼 쉬울 것이다.

Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "Monitor0"
DefaultDepth 24
SubSection "Display"
Viewport 0 0
Depth 24
Modes "1680x1050"
EndSubSection
EndSection

Xorg는 I2C/DDC정보를 통해 와이드 스크린으로 부터 해상도 정보를 가져올 수 있을 만큼 충분히 영리하다. 그래서 어떤 모니터가 얼마나 높은 해상도와 주파수를 허용하는 지 다룰 수 있다.

ModeLines이 드라이버에 존재하지 않다면, Xorg에 약간의 힌트를 줄 필요가 있을 지도 모른다. /var/log/Xorg.0.log를 사용해서 작동 할 수 있는 ModelLine을 수동적으로 생성하는 충분한 정보를 추출 할 수 있다. 다음과 같은 정보를 한번 살펴 보자

(II) MGA(0): Supported additional Video Mode:
(II) MGA(0): clock: 146.2 MHz Image Size: 433 x 271 mm
(II) MGA(0): h_active: 1680 h_sync: 1784 h_sync_end 1960 h_blank_end 2240 h_border: 0
(II) MGA(0): v_active: 1050 v_sync: 1053 v_sync_end 1059 v_blanking: 1089 v_border: 0
(II) MGA(0): Ranges: V min: 48 V max: 85 Hz, H min: 30 H max: 94 kHz, PixClock max 170 MHz

이 정보는 EDID 정보라고 불린다. 이것으로 부터 ModeLine을 생성하는 것은 그져 정확한 순서로 숫자를 붙여 넣는 문제이다.

ModeLine <4> <4>

이 예제를 위한 Monitor 섹션의 ModeLine은 다음과 같다.

Section "Monitor"
Identifier "Monitor1"
VendorName "Bigname"
ModelName "BestModel"
ModeLine "1680x1050" 146.2 1680 1784 1960 2240 1050 1053 1059 1089
Option "DPMS"
EndSection

이제는 단순히 문서편집 단계만 완벽하게 하면 된다. X는 여러분의 와이드 스크린 모니터에서 시작하게 될것이다.


fglrx 드라이버 설치:
ati.amd.com/support/driver.html에서 R710에 해당하는 Ati Radeon HD 시리즈의 4xxx번호를 갖는 드라이버를 다운로드 받자. 이건 소스코드로 컴파일 해서 사용해야 하기 때문에 시스템을 컴파일 가능한 환경으로 갖추어 놓아야 한다.

# apt-get install build-essential linux-headers-$(uname -r) module-assistant

이제는 다운 받은 드라이버로 .deb 패키지를 만들어 보자.

# sh ati-driver-installer-10-7-x86.x86_64.run -buildpkg Debian/testing

그리고 .deb 패키지를 현재 디렉토리에 인스톨하자.

# dpkg -i package.deb

# cd /usr/src

# tar jxpvf fglrx.tar.bz2

# cd /usr/src/modules/fglrx

커널 모듈을 생성하자.
# sh make.sh

생성된 커널 모듈을 시스템의 모듈 디렉토리로 옮기자.

# cp fglrx.ko /lib/modules/xxxxx-686/kernel/drivers/char/drm/

그리고 모듈을 로딩하자.

# modprobe fglrx

xorg.conf의 그래픽 드라이버를 변경하고, 부팅시 자동적으로 로딩할도록 /etc/modules에 fglrx를 추가하자. 그리고 부팅한 다음 dmeg | grep "fglrx"로 로딩 되었는지 확인하자.

Note: 해본 결과 ati driver 다운로드 받은 이후의 과정은 다변화 되었다. 아마도 ati에서 많이 신경써서 해놓은 것 같다.

sh ati-driver-installer-10-7-x86.x86_64.run -- install

이후로 모든 작업은 자동으로 해주고 있다.


출처 : http://www.debianadmin.com/how-to-install-ati-fglrx-driver-in-debian.html

2010년 8월 5일 목요일

Debian 설치

  • Debian 5.0설치후 문제상황
debian 5.0을 network install 버전으로 설치 했다 모든 것을 기본 설정으로, 하지만 동작하지 않는다. Xorg에 문제가 발생한 것 같아 /etc/X11/xrog.conf를 찾아 보니 아무런 설정이 되어 있지 않다. xorg.conf를 찾는 좀 시간이 걸렸다. 그냥 ls로 /etc/X11을 뒤지니깐 디렉토리밖에 나오지 않더라 ls -a를 했어야 하는데 결국은 find / -name xorg.conf로 찾아 보니 거기에 있더라.
우선 runlevel을 변경해야 겠다. 자꾸 GUI로 부팅하는 바람에 모니터에 아무것도 나오질 않는다. 우선 text모드로 부팅해서 xorg를 설정해 나아가야 겠다. 우선은 sing-user mode로 부팅해서 설정하고 하나 밖에 없는 계정을 text모드로 부팅해서 xorg를 변경해야 겠다. 아 xorg를 자동으로 설정해주는 명령어가 있었는데 기억이 안난다. 다시 googling해야 겠다.
  • xorg 설정
찾아보니 dkpg-reconfigure xserver-xorg와 Xorg -configure로 두개의 명령어가 찾아 진다. dpkg-.. 는 내가 쓰던 명령어 같아 해보니 비디오 설정과 모니터 설정부분이 사라졌다. 그리고 실행이 안된다. 그래서 Xorg -configure로 했더니 xorg.conf.new라는 설정을 만들어 놓더니 그걸로 xorg를 샐행해 보라고 한다. xorg.conf.new는 /root/밑에 만들어 진다. 이걸 기본 xorg 설정 파일로 사용하기 위해선 /etc/X11/밑에 복사해 두도록 하자.
하드웨어 제원
lspci로 달려 있는 비디오 카드를 확인해보니
01:00.0 VGA compatible controller : ATI Technologies Inc Device 954f
01:00.1 Audio device : ATI Technologies Inc Device aa38
두개가 달려 있다. VGA compatible controller는 알겠는데 Audio device는 왜 잡힌건지 모르겠다. 비디오 카드만 꼽아 두었는데

2010년 7월 31일 토요일

stm32f10x에서 malloc의 최소 할당 메모리 사이즈(page size) 변경하기

임베디드 시스템에서 CodeSourcery 사의 arm-none-eabi 툴체인 사용시 page size가 4kB으로 되어 있다. 하지만 stm32f10x의 메모리는 보통 20kB 많아도 68kB다 이러한 상황이니 page size를 작게 변경하거나 malloc()대신 _malloc_r을 사용한다고 되어 있다만, 소스코드를 일일이 변경해야 하고 다른 시스템에서 다시 복구해야하는 문제점이 발생한다. 그래서 arm-none-eabi의 libc로 사용중인 newlibc의 page사이즈를 재설정하고 다시 컴파일해야한다. 하지만, 그리 간단한 일이 아닌가 보다. 다음과 같은 해답을 구했다.

> The mallocr.c from the newlib-source checks a define SMALL_MEMORY which
> sets the alignment to 128.
>
> Which sounds more reasonable.
>
> But I think this sbrk() stuff is quiet needles for system w/o virtual
> memory where the size of the heap is fixed at link-time.

그리고 _malloc_r에 대해서 찾아 보았다.

The _malloc_r routine is indeed a version of malloc which uses an additional
parameter to receive a reentrancy structure. The malloc routine simply calls _malloc_r with
the default reentrancy structure. Internally, any reentrant library routines must
call _malloc_r instead of malloc and pass whichever reentrancy structure was
passed to them. Thus, you want to replace the _r interfaces rather than the
top level routines like malloc() and free().

Multithreaded applications must create their own separate reentrancy structures per
thread and must use _r routines where provided. For more information, see the
library info files (make info install-info). You can alternatively peruse the info source
for the reentrancy chapter in newlib/libc/reent directory (reent.tex).

A while back, _malloc_r used to use manage heap storage from pools that were
stored off of the reentrancy structure. Now, the reentrancy structure is used
as a mutex identifier for __malloc_lock and __malloc_unlock. By default,
__malloc_lock and __malloc_unlock are only provided as stubs.

If you don't need to worry about multithreaded applications using your malloc,
simply create versions of _malloc_r, _free_r, _calloc_r, and _realloc_r that
ignore the reentrancy structure. Otherwise, you will have to either use
a mutex system (and supply mutex routines) or use a separate pool per reentrancy
structure.

아 모르겠다. 어쩌라는 건지?

2010년 7월 26일 월요일

Configuration of Matrox Meteor-II + MIL-lite


-->
출처는 알수 없지만, 문제가 된다면 연락주세요 오래된 내용 정리하다가
필요한 사람들이 있을 것 같아 이렇게 올려 봅니다.
Mil Mil Lite, Active Mil 과의 차이점
MIL-LITE 의 경우는 Matrox Frame Grabber 설치를 위한 Driver를 제공하며 기본적인 Frame Grabber 기능 즉, 영상획득, Display, 영상 Load, 저장이 가능한 Module들로 구성되어 있습니다.
주로 영상을 획득하여 Image 확인 및 이에 대한 저장을 위해 많이 사용되며 Image data를 직접 Access하여 독자적인 Processing처리 및 알고리즘을 적용할 수 있습니다.
MIL의 경우는 MIl-Lite에서 저공하는 기능을 포함하며 영상 처리를 위해 사용되는 알고리즘이 쉽게 사용할 수 있는 함수로 구현되어 있습니다.
, Image Processing, Pattern matching, OCR, blob, Measurement등의 기능을 함수로써 제공하므로 누구나 쉽게 사용하실 수 있도록 구성되어 있습니다.
MIL은 우리가 Visual C++ 환경에서 c language를 사용하여 programming 할 수 있도록 Library가 구성되어 있습니다.
Active MIL Active X를 사용하는 것으로써 Visual Basic Visual C++환경에서 개발이 가능하며 mil에서 사용하는 module들이 control들로 구성되어 있습니다.
MIL에서는 사용하기 위한 module들에 대한 선언 및 초기화 작업에 대한 작업을 coding을 통해 설정을 해주는 반면에 Active MIL의 경우는 Active X control로 모든 module들이 구성 되어 있어 control Form Resource에서 원하는 control을 선택하고 여기에 대한 초기화를 속성 창을 통해 설정을 합니다.
지원하는 기능은 동일하며 다만 사용하는 함수의 표현방식이 개발환경에 따라 다릅니다.

S/W License 정책 및 Maintenance
License의 경우는 MIL-Lite의 경우는 구매하시면 한 법인 내에서 1copy free로 사용가능합니다. 그러나 MIl의 경우는 1copy당 각각의 license가 있습니다. Hardware Lock key가 있어야만 사용이 가능 합니다. 따라서 2개 이상 사용시는 Hardware
Lock key를 추가로 구매하셔야 합니다.
Maintenance의 경우는 구매 후 1년 이내이면 Minor version upgrade시 무상 upgrade가 가능합니다. 그러나 Major version upgrade 및 구매 후 1년 이상이 지나신 경우는
Maintenance 비용을 지불하시면 upgrade가 가능합니다.

Mil Uninstall이 잘 되지 않을 경우
win2K 환경에서는 레지스트리 관리에 의해 MIL은 자체적인 Uninstall후에도 MIL이 제대로 제거되지 않는 경우가 있습니다.
또한 불가피하게 MIL을 다시 설치하게 될 경우 Uninstall 과정을 거친 후 다시 설치를 하게 되는데 설치가 제대로 되지 않는 경우가 있습니다.
이럴 경우에는 다음과 같이 setting을 하시면 됩니다.
1. Registry 편집기를 실행시킨다.
2. HKEY_LOCAL_MACHINE\SOFTWARE\Matrox의 폴더를 삭제 단, Matrox Desktop 제외
3. HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MtxDma0의 폴더를 삭제
4. ControlSet003, ControlSet004, Current ControlSet 각각의 폴더 아래에 있는 MtxDma0도 모두 삭제
5. Boot.ini File 확인 사항Uninstall Boot.ini 파일 안에 메모리 관련 수치가 삭제되었는지 확인
C:\WINNT 폴더에 Boot.ini 파일의 내용 중 메모리 관련 내용을 삭제합니다.
Boot.ini File 내용의 일부분
[Operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft
Windows 2000 Professional(Memory :
NT=228MB, MIL=20.0MB)(Memory : NT=148MB,
MIL=100.0MB)" /MAXMEM=148 /MAXMEM=248 /fastdetect
6. 재부팅

Mil을 설치 했는데 보드가 제대로 인식이 되지 않는 경우
MIL을 설치한 후 장치관리자에서 새로운 장치가 올바르게 설치되었는지 여부를 확인할 수 있습니다. Board를 제대로 인식하지 않는 경우는 다음과 같습니다.
1. 적절한 드라이버가 설치되지 않아 노란 물음표기 표시되어 있는 경우
2. Frame Grabber Adapter가 잘못 명기되어 있는 경우
예를 들어 Meteor2/4 또는 Meteor MC를 설치했는데 인식되는 board MeteorII-digital Frame Grabber 일 경우 그 반대의 경우 MeteorII-digital을 설치했는데 MeteorII라고 인식되는 경우
3. Intellicam에서 System Device0로 인식되지 않는 경우
1~3번의 경우는 장치관리자에서 드라이버 업데이트를 통해 적절한 드라이버를 설치하도록 설정, 재부팅 합니다. 그런 후에도 board가 잡히지 않는다면 IRQ setting이 어떻게 되어있는지 확인하시고 IRQ의 설정을 변경한 후 check를 합니다.

Intellicam을 잘 활용하는 방법
Intellicam Matrox에서 제공하는 하나의 Application Program으로 MIL MIL-Lite 모두에 포함되어 있는 program 입니다.
Application program
1. Board가 제대로 인식되는지에 대한 확인
2. 사용하는 camera에 대한 적절한 dcf 제작및 편집
-> 대부분 Matrox에서 제공하며 sync mode exposure time을 원하는 형태로 설정하는 것을 이 Application program을 통해 편집 가능
3. 제공되는 또는 제작 편집을 한 dcf camera와의 interfacing을 통해 영상이 제대로 획득 되는지를 원하는 결과가 나타나는 지 렌즈 및 빛의 밝기 등이 적절하게 선택되었는지 확인 할 수 있습니다.
또한 dcf의 편집을 통해 다양한 기능을 수행할 수 있으며, 간단한 Digitizer control을 할 수 있습니다.
원하는 영상이 획득된다면 이에 해당하는 dcf를 사용하여 program을 작성하시면 됩니다.

Matrox에서 제공 하는 예제를 보는 방법
Visual Studio 6.0 환경에서 Source를 불러와서 직접workspace를 생성할 때
예제는 Active MIL MIL 예제가 제공되고 있습니다.
예제에 대한 전반적인 기능에 대해 살펴보기 위해서는 시작/프로그램/Matrox
Imaging/Active MIL(MIL)/Example 을 클릭하시면 됩니다.
Active MIL의 경우는 바로 예제를 Simulation할 수 있도록 지원되는 형태로 이루어져있습니다. 따라서 원하는 Program에 대한 결과를 볼 수 있습니다.또한 오른쪽 하단에 Edit이라고 나타나 있는 Button click할 경우 visual Basic에서 구현된 code form을 바로 볼 수 있습니다.
MIL의 경우는 각 예제에 대해 각각 선택을 할 수 있으며 이것을 선택하셔서 결과를 확인할 수 있습니다.
Code C:/program files/Matrox Imaging/MIL/examples 에서 원하시는 code를 살펴볼
수 있습니다.
물론 Active MIL도 위와 같은 방법으로 볼 수 있으며 Visual C++ 환경에서 coding program도 볼 수 있습니다

Mil workspace 생성을 위한 setting
MIL을 이용한 program을 실행하기 위해서는
1. Tool/option을 선택하셔서 Directories Tab에서 Library include File Matrox Include Library를 설정해주십시오.
2. 그런 후 complie을 하시면 workspace가 생성이 되면서 error가 여러개 발생합니다.
error의 경우는 각 module에 대한 library link되지 않아서 발생하는 error이므로 다음과 같은 설정을 합니다.
- project/setting tab link program에서 사용되는 library module을 삽입해 주시면 됩니다.
예를 들면 mblob.c를 사용할 경우 기본적으로 mil.lib milblob.lib, milim.lib library를 첨가해주시면 됩니다.
3. 다시 Complie 합니다.

Mil (or Mil lite) 소스의 기본구조
MIL(Matrox Imaging Library) Matrox에서 나오는 Frame Grabber를 사용하기 위해서 필요한 일종의 라이브러리입니다.
MIL MIL-lite의 두 종류로 나뉘어 있으며 MIL MIL-lite에 들어있지 않은 Image Processing관련 함수들이 포함되어 있습니다.
MIL을 처음 다루시는 분들을 위해 간단한 grab예제로 설명을 하도록 하겠습니다.
/* MIL함수들이 정의되어 있는 함수로써 include 해주셔야 합니다.*/
#include <>
#include <>
void main(void)
{
/* MIL에서 각 개체들을 다루는 data type으로서, 아래와 같은 */
/* 항목들을 지정합니다. */
MIL_ID MilApplication,
/* 제작하는 응용프로그램 ID */
MilSystem,
/* Frame Grabber ID */
MilDisplay,
/* Display를 위한 ID */
MilDigitizer,
/* Digitizer Camera를 위한 ID */
MilImage;
/* Image Buffer를 위한 ID */
/* 응용프로그램에서 각 ID들을 기본적인 설정으로 할당합니다. */
MappAllocDefault(M_SETUP, &MilApplication, &MilSystem,
&MilDisplay, &MilDigitizer, &MilImage);
/* Monitor MilImage의 내용을 Display하기 위한 설정을 합니다. */
MdispSelect(MilDisplay, MilImage);
/* Camera에서 Grab하여 MilImage에 저장합니다. */
MdigGrab(MilDigitizer, MilImage);
/* printf */
printf("An image has been grabbed.\n");
printf("Press to end.\n");
getchar();
/* 처음에 할당한 ID들을 해제합니다. */
MappFreeDefault(MilApplication, MilSystem,
MilDisplay, MilDigitizer, MilImage);
}
위에서 각 ID들을 할당하고 해제시켜주는 것은 모든 응용프로그램에서 동일합니다.
다만 각 경우에 따라 각 ID들을 따로 할당시키고 각각 해제할 수 있습니다.
각각의 MIL_ID를 할당 및 해제하는 함수는 다음과 같습니다.
MilApplication - MappAlloc, MappFree
MilSystem - MsysAlloc, MsysFree
MilDisplay - MdispAlloc, MdispFree
MilDigitizer - MdigAlloc, MdigFree
MilImage - MbufAlloc2d, MbufAllocColor, MbufFree, etc
여기서 주의하실 점은 할당 및 해제할 때 순서에 따라야 한다는 것입니다.
할당의 경우는
MappAlloc -> MsysAlloc -> MdigAlloc, MdispAlloc, MbufAlloc
해제의 경우는
MdigFree, MdispFree, MbufFree -> MsysFree -> MappAlloc
의 순서입니다

Visual C++에서 Mil 사용 팁!!
1. MIL help 이용방법
- MIL을 설치하신 후에 메뉴>Tools>Customize에 들어가셔서 Add-ins and Macro Files 탭을 보시면 다음과 같은 항목이 추가되는 걸 확인하실 수 있습니다.
. Matrox ActiveMIL VC++ Add-In
. Matrox MIL VC++ Add-In
여기서 Matrox MIL VC++ Add-In을 추가하시면 Visual C++을 사용하시다가 MIL함수에 대한 도움말을 보실 때, 함수 명위에 커서를 위치시키고, Ctrl+F1을 누르시면 바로 MIL help를 보실 수 있습니다.
2. LINK : fatal error LNK1104: cannot open file "mil.lib"
(or error LNK2001: unresolved external symbol)
프로그래밍을 조금만 해보신 분이라면 아시겠지만, 위 에러는 컴파일할 때 mil library를 못찾은 까닭입니다. 이 때는 메뉴>Tools>Options에서 Directories탭에 가셔서 library files의 디렉토리로 MIL library파일이 있는 경로를 추가해주시면 됩니다.
일반적인 경우 경로는 다음과 같습니다.
C:\PROGRAM FILES\MATROX IMAGING\MIL\LIBRARY\WINNT\MSC\DLL
Include file도 똑같이 해주시면 되고, 경로는 다음과 같습니다.
C:\PROGRAM FILES\MATROX IMAGING\MIL\INCLUDE
(주의)이미 만들어진 소스를 가지고 작업을 하시게 될 경우에도 위의 에러를 보시는 경우가 있을 것입니다. 이것은 기존 workspace에 설정돼있는 lib화일의 경로와 현재 사용하시는 컴퓨터에서의 경로가 다르기 때문인데, 이때는 위의 directories설정을 제대로 해주셔도 위와 같은 link error가 발생합니다.
이때는 workspace view에 있는 *.lib화일을 삭제하시고 다시 컴파일하시면 됩니다.

Milimage 를 파일로 저장하거나 불러오는 방법
MIL에서 기본으로 사용하는 Image Format *.mim형태의 tiff형식의 화일입니다.
따라서 MbufLoad MbufSave를 다음과 같이 사용하시면, mim화일로 저장 또는 불러오기가 가능합니다.
MbufLoad("load.mim", MilImageLoaded);
MbufSave("save.mim", MilImageSaved);
그러나 일반적으로 사용하는 포맷인 jpeg이나 tiff, raw등의 이미지화일포맷은 다음의 함수를 사용하여 저장 또는 불러오기가 가능합니다.
MbufImport("sample.jpg", M_JPEG_LOSSY, M_RESTORE,
MilSystem, &MilImage);
MbufExport("sample.tif", M_TIFF, MilImage);
그리고 Image sequence avi파일로도 저장이 가능한데, 이때는 MbufImportSequence, MbufExportSequence함수를 이용하시면 됩니다.

Mil을 이용한 프로세싱 시간 측정
프로그램을 직접 작성하시다 보면 각 부분들의 성능을 측정하고, 디버깅을 위해 Timer가 필요한 경우가 많습니다. 이럴 경우 MIL, MIL-lite에서 제공하는 MappTimer를 사용하시면 됩니다. 사용방법은 매우 간단합니다.
/* Return되는 시간값의 단위는 sec()이고, 따라서 보통
Time*1000(ms)로 사용합니다. */
double Time;
MappTimer(M_TIMER_RESET, M_NULL);
/* 이곳에 시간측정대상이 되는 프로세스가 들어갑니다.*/
MappTimer(M_TIMER_READ, &Time);

Mil을 이용한 프로세싱 시간 측정
Matrox 프레임그래버의 드라이버는 따로 화일로 주어지지는 않습니다. MIL이나 Mil-lite를 설치하실 때 깔게 되구요. 창이 설치도중에 뜨게 되는데 이때 선택하신 보드의 드라이버들이 깔리게 됩니다.
MIL이나 Mil-lite의 설치가 끝난 후 프레임그래버가 자동으로 잡히지 않는 경우에는 장치관리자를 확인하여 주시기 바랍니다. 제대로 잡혔다면 Matrox Imaging Adapter라는 폴더가 생기고 그 안에 프레임그래버정도가 들어있게 됩니다.
느낌표나 x표가 있을 경우 제대로 인식이 안된 것입니다. 이때는 등록정보의 드라이버탭의 드라이버 업데이트를 해주십시요.
위와 같이 하시면, 창이 새로 뜨게 되는데 여기서 밑의 항목을 선택합니다.
그러시면, 설치하신 프레임그래버 드라이버중 사용가능한 드라이버의 목록이나 설치할 준비가 되었다는 메시지가 뜨게 됩니다.
(참고로 Meteor2/Multi-Channel보드도 MeteorII라고만 표시됩니다.)
그리고 나시면 Intellicam 에서 Device 0 라고 나온것을 확인하실 수 있습니다.

2010년 7월 23일 금요일

WinAVR + Eclipse + AVR Plug-in Developement Environment Setting



AVR의 Windows버전 컴파일 도구 모음집인 WinAVR을 설치하자.
위의 사이트에 가서 최신의 버전을 다운받자. 지금 테스트 하는 시점의 버전은 20100110이다. 그리고 전에 언급한적 있는 Eclipse의 최신 버전을 다운 로드 받자. 다운 받을 주소
에서 최신버전의 Eclipse IDE for C/C++ Developer를 다운 로드 받자. 테스트하는 현시점의 최신 버전은 코드네임 Helios로 되어 있다. 주의 해야 할 것은 Windows의 버전이 32bits인지 64bits인지 구분해야한다. 여기에서는 32bits의 버전만 가지고 다룰 것이다. 64bits가 잘 동작하는지는 아직 잘 모르겠다. 그럼 위와 같이 설치를 마치게 되면 WinAVR은 C:\WinAVR-20100110에 설치되고 Eclipse는 C:\Eclipse에 설치 될 것이다.
그럼 새로운 프로젝트를 갖는 Workspace를 만들자 경로는 C:\work\AVR로 하고 Eclipse를 실행하자. 물론 workspace는 C:\work\AVR로 설정하는 것을 읻지 말자.


아직 AVR Workspace에는 아루런 프로젝트 정보가 없기 때문에 다음과 같은 Welcome화면만 보여 질 것이다. 우선 무시하고 Workbench 모드로 전환하자.




그럼 다음과 같이 Project Explore에 아무런 설정이 되어 있는 않는 빈 상태의 workbench가 열리게 된다.



Eclipse의 AVR Plug-in을 우선 설치해 보도록 하자. Eclipse 메뉴의 Help->Install New Software를 선택하자. Work with: 항목의 Add 버튼을 클릭하자.



그리고 다음과 같이 AVR Eclipse Plugin을 설치하기 위한 주소를 추가한다.



Work with: 의 주소를 AVR Eclipse Plugin으로 설정하고 CDT Optional Features중에서 AVR Eclipse Plugin만 설치하자. Source는 필요없는 부분이다. 필요 없다기 보단 불필요하게 다운 받을 필요가 없다.


자 그럼 이제 필요한 준비물들은 다 준비가 되었다. AVR Plugin을 이용해서 새로운 프로젝트를 생성하자. File 메뉴의 New -> C Project를 선택하고 다음과 같이 AVR128_MP3라는 프로젝트를 생성하자.


Next를 클릭하고, Debug와 Release 설정을 모두 선택하고 Next를 클릭하자.


프로젝트의 MCU 타입과 Crystal의 주파수를 ATmega128l과 16Mhz로 설정하고 Finish를 클릭하자.



자 이상으로 프로젝트를 생성하는 것은 마무리 되었다. 소스코드와 헤더파일및 데이터 파일은 File->New-> Source FIle 이나 Header FIle을 통해서 얼마든지 추가하고 수정할 수 있다.

이제는 avrdude.exe를 통한 이미지 업로드하는 설정을 하도록하자. Project 메뉴의 Properties항목을 선택하자. 그리고 AVR->AVRDude항목을 선택하자.



그리고 Programmer 탭의 New 버튼을 클릭하고 다음과 같이 설정하자.



그리고 Fuses 탭에 가서 다음과 같이 설정한다.
http://www.engbedded.com/fusecalc/ 에서 Fuse 계산기를 사용하면 내가 원하는 설정을 쉽게 알아 낼 수 있다. 우선은 다음과 같이 설정하자.











Atmega128 Module + USBTinyISP Under WinAVR
  • Atmega128 Module Schematic
  • USBTinyISP Schematic
  • Fuse Setting
    • AVR Part name
      Atmega128-PI
    • 4096 words boot 0xf000~0xffff, app 0x0000~0xefff
      BOOTSZ[1:0] = 00 ;
    • Start-Up time 258 CLK
      KSEL0:SUT[1:0] = 000;
    • 16Mhz Crystal
      CKOPT = 0;
Low : 0xce, High : 0x09, Ext : 0xff

2010년 7월 21일 수요일

STMicrosystem 사의 프로세서 stm32를 위한 개발환경 설정


1. 컴파일러 설치
ARM EABI GCC가 포함된 컴파일러 도구인 CodeSourcery G++ Lite를 다음 주소 http://www.codesourcery.com/sgpp/lite/arm/portal/subscription3053 에서 다운받자.



현재 시점에서 가장 최신버전인 Sourcery G++ Lite 2010q1-188을 설치하자.




모든 사용자가 사용할 수 있도록 PATH를 지정하도록 설정한다.



설치를 마치고 사용 방법을 살펴보도록한다.



2. IDE(Integrate Development Environment) 설치
http://www.eclipse.org/downloads/ 에서 Eclipse IDE for C/C++ Developer중에서 windows 32bits 버전을 다운 받고 c:\에 압축을 해제한다.

3. JRE(Java Runtime Environment) 설치
Eclipse를 설치하고 c:\eclipse\eclipse.exe를 실행하면 다음과 같은 메시지를 출력한다.


http://java.com/ko/download/windows_ie.jsp?locale=ko&host=java.com 에서 무료 Java 다운로드 항목을 클릭하여 JRE를 다운로드한다. 현재 시점에서 JavaSetup6u21.exe가 실행되면 설치시에 대상 폴더 변경을 선택한다.


그리고 c:\eclipse\jre라는 폴더를 만든다.



JRE 설치시에 대상폴더를 위의 폴더로 변경한다.



4. Eclipse 환경 설정
Eclipse를 실행하면 다음과 같이 workspace를 설정하는 화면이 나온다.


C:\work\STMicrosystem이라는 폴더를 생성하고 위의 경로를 C:\work\STMicrosystem으로 변경하자.


그러면 Loading Workbench 라는 메시지와 함께 Eclipse의 로딩 화면이 시작된다.



로딩이 종료된 시작화면은 다음과 같다.



새로운 프로젝트의 생성 File->New->C Project 를 선택하고 다음과 같은 STM32_MP3라는 프로젝트를 생성한다.


그리고 다음 화면에서 Workbench로 모드를 전환한다.


STM32_MP3라는 프로젝트가 Project Explore에 나타나고 내용은 아직 아무것도 없는 상태가 된다.


5. 프로젝트 파일 작성
생성된 프로젝트 STM32_MP3의 Project Explore 탭에서 오른쪽 버튼을 클릭하여 Property항목을 선택한다.



항목중 C/C++ Build의 Environment항목을 선택하고, 컴파일러의 경로를 지정해주기 위한 새로운 환경변수를 등록하자.

Add 버튼을 선택하고 아래와 같은 새로운 변수를 등록하자. 경로는 위에서 설치한 컴파일러의 경로인 C:\Program Files\CodeSourcery\Sourcery G++ Lite\bin을 추가하자.



위와 같이 컴파일러를 설정하면 컴파일러를 사용할 준비가 다 완료 되었다. 하지만, Eclipse에서 Build All을 선택하게 되면 Console에서 다음과 같은 메시지를 출력한다.


이메시지는 컴파일하는데 필요한 make명령어가 없다는 것을 알려주는 것이다. 실제로 컴파일러의 경로를 따라 가보면, 다음과 같이 make 명령어가 없고 cs-make라는 명령어만 존재한다.



이 부분을 해결하기 위해서 다시 Project의 Property부분으로 되돌아 가서 Use default build command를 해제하고 make부부분을 cs-make로 변경하자.



6. 디버깅환경 설정하기
여기서 사용할 디버깅 도구는 olimex사에서 나오는 openusbjtag이라는 장비와 OpenOCD라는 소프트웨어가 된다. 일반적인 Wiggler도 약간의 차이점만 있을 뿐 거의 비슷한 수준일 것이다. 우선 OpenOCD 의 최신 버전을 다운 받자. 불행히도 OpenOCD 최신버전은 git서버를 통한 접근만 허용하고 있기 때문에 Windows에서 사용할 수 있는 바이너리 구하는 것이 쉽지 않다. 하지만,공식적으로 http://www.freddiechopin.info/ 사이트에서 제공한다. Download/OpenOCD 0.4.0.msi 파일을 다운받자.



잘 살펴보면 Due to alleged GPLv2 license incompatibility of using ftd2xx.dll libraries, this version was compiled to use libftdi + libusb-win32 librarie 이라는 글에서 알 수 있듯이 ftd2xx.dll파일이 GPLv2 라이센스에 부합하지 않다고 다른 방법으로 사용하고 있음을 알려주고 있다. 우선은 설치해 보도록 하자.



설치가 완료되면 Eclipse를 다시 실행하자. Eclipse의 Run->External Tool -> External Tools Confiturations를 선택하자. 그리고 다음과 같이 이미지를 Upload하도록 하는 설정을 하자.



그리고 Debug를 하기 위한 설정을 다음과 같이 하자.


한가지 빼먹은 것이 있다. 위의 두설정의 각각의 Common탭의 Display in favorites menu에 External Tools를 체크해야지만 메뉴상에 나타나서 쉽게 사용할 수 있다. 그리고 위에서 언급된 olimexopenocd.cfg, stm32_jtag.cfg, stm32_program_eclipse_jtag.cfg, 그리고 stm32_debug_jtag.cfg라는 파일은 다음과 같다.

----------------------------------- olimexopenocd.cfg--------------------------------------
#interface
interface ft2232
ft2232_device_desc "Olimex OpenOCD JTAG A"
ft2232_layout "olimex-jtag"
ft2232_vid_pid 0x15BA 0x0003
------------------------------------------------------------------------------------------------

--------------------------- stm32_jtag.cfg ---------------------------------------------
# script for stm32

if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME stm32
}

if { [info exists ENDIAN] } {
set _ENDIAN $ENDIAN
} else {
set _ENDIAN little
}

# Work-area is a space in RAM used for flash programming
# By default use 16kB
if { [info exists WORKAREASIZE] } {
set _WORKAREASIZE $WORKAREASIZE
} else {
set _WORKAREASIZE 0x4400
}

# JTAG speed should be <= F_CPU/6. F_CPU after reset is 8MHz, so use F_JTAG = 1MHz
jtag_khz 1000

jtag_nsrst_delay 100
jtag_ntrst_delay 100

#jtag scan chain
if { [info exists CPUTAPID ] } {
set _CPUTAPID $CPUTAPID
} else {
# See STM Document RM0008
# Section 26.6.3
set _CPUTAPID 0x3ba00477
}
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID

if { [info exists BSTAPID ] } {
# FIXME this never gets used to override defaults...
set _BSTAPID $BSTAPID
} else {
# See STM Document RM0008
# Section 29.6.2
# Low density devices, Rev A
set _BSTAPID1 0x06412041
# Medium density devices, Rev A
set _BSTAPID2 0x06410041
# Medium density devices, Rev B and Rev Z
set _BSTAPID3 0x16410041
# High density devices, Rev A
set _BSTAPID4 0x06414041
# Connectivity line devices, Rev A and Rev Z
set _BSTAPID5 0x06418041
}
jtag newtap $_CHIPNAME bs -irlen 5 -expected-id $_BSTAPID1 \
-expected-id $_BSTAPID2 -expected-id $_BSTAPID3 \
-expected-id $_BSTAPID4 -expected-id $_BSTAPID5

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m3 -endian $_ENDIAN -chain-position $_TARGETNAME

$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0

set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME stm32x 0 0 0 0 $_TARGETNAME

# For more information about the configuration files, take a look at:
# openocd.texi
------------------------------------------------------------------------------------------------

--------------------------- stm32_program_eclipse_jtag.cfg -------------------------
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666

init
jtag_khz 1125
reset init
verify_ircapture disable

halt
poll
stm32x mass_erase 0
flash write_image stm32f10x.bin 0x08000000 bin
reset run
shutdown
------------------------------------------------------------------------------------------------

-------------------------------- stm32_gdb_jtag.cfg --------------------------------------
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666

#swj_mode 2

init
jtag_khz 565
reset init
verify_ircapture disable
------------------------------------------------------------------------------------------------

그리고 Wiggler를 사용할 경우 다음과 같은 내용의 *.cfg 파일을 만들어서 olimexopenocd.cfg파일을 대체시키면 사용이 가능하다.

#
# Parallel port wiggler (many clones available) on port 0x378
#
# Addresses: 0x378/LPT1 or 0x278/LPT2 ...

interface parport
parport_port 0x378
parport_cable wiggler

여기까지는 외부장치에 대한 설정을 하는 것이다. 실제로 Eclipse가 외부장치(Jtag 디버거)와 통신할 수 있는 환경을 만들어 주는 것도 설정해 주어야 한다. 단순히 이미지 업로드 하는 것은 별다른 설정없이 업로드할 이미지 즉, stm32_program_eclipse_jtag.cfg파일에서 stm32f10x.bin만 정확히 설정해 주면 동작하지만 디버깅의 경우 좀더 설정해 주어야 할 것이 있다. 우선 Eclipse에서 GDB Hardware Debugging 을 지원해주는 Plug-in을 설치하자. 설치하기 위해서 소프트웨어가 들어있는 서버의 주소를 아래와 같이 먼저 설정해 주어야한다. Help->Install New Softwares ->"Available Software Sites"를 선택하면 된다.


그리고 Work with항목에 위의 주소를 설정해 주고 다음 Plug-in을 설치하고 재시작하자.



Run메뉴에서 Debug Configurations를 선택한다. 그러면 다음과 같은 화면이 나타난다.


왼쪽 탭의 네가지 항목중에서 GDB Hardware Debugging을 선택하고 New 버튼을 클릭한다. 그리고 Debugger 탭에서 가서 다음과 같이 설정하고 Apply버튼을 누른다.