항상 avr만을 하다 2440임베디드 리눅스 프로젝트에 참여하게 되었습니다.

제가 맡은 분야는 웹서버 및 OLED 디바이스 드라이버 부분 입니다.

여기서는 웹서버 포팅 후 사용자 인증 시스템 제작에 관한 부분 입니다.

펌웨어만을 하다가 cgi 라는 서버사이드프로그램은 처음 만져보아 막막하였습니다.;;

html 이야 기본은 알고 있었지만 cgi 라 하여 생소하였습니다.

임베디드 리눅스 상에 perl 이나 php asp 와 같은 서버사이드프로그램들은 대부분 포팅되어 있지 않아

어쩔수 없이 apache 기반에 cgi를 사용하게 되었습니다.

몇몇의 사이트 검색 결과 boa webserver 에 php를 붙여 사용하신다는 분도 kelp 에서 본 기억이 있긴 합니다만 열악한 환경상의 임베디드 기반 시스템에 db 및 php 스크립트와 같은 덩치큰(?) 프로그램을 사용하기엔 힘이 듭니다;;

 

리눅스 상의 cgi 는 c를 기반으로 프로그래밍 하게 됩니다.

컴파일 역시 arm linux gcc를 이용하여 하게 됩니다.

 

================

2009년 2월 9일 추가

================

웹서버로 apache 를 선택하였습니다.

그 이유는 쉬운 포팅과 cgi의 기본 지원을 들 수 있습니다. 물론 gohead webserver 와 자주 사용되는 boa webserver 도 있지만 대중적으로 사용되는 apache webserver에 한표를 두었습니다.

webserver porting을 마친 후 바로 cgi 프로그래밍에 들어갔습니다.

우선 apache의 환경 설정 부분에서 cgi- script를 사용 가능하도록 수정 후 index.html 을 제작하여

로그인 부분 ui를 꾸몄습니다.

그 후 폼으로부터 입력된 id와 password 를 파싱하는 login.cgi 를 제작하였습니다.

로그인 될 아이디와 패스워드는 임베디드보드 안에 따로 디비를 두기에 공간이 충분치 않아 account.dat 파일을

제작하여 보관하도록 하였습니다. 다음 부분은 로그인 부분의 소스 입니다.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000        //login retry
#define RNUM 30         //retry number
#define TRUE 1
#define FALSE 0


int main(int argc, char *argv[])
{

                FILE *fp;

                int fd;         //file description
                int i;
                int index = 0;
                int len1, len2, len;
                char std[10][16];
                char *tmp;
                char *id;
                char *password;
                char *buf;
                char *str1, *str2;

                printf("Content-type:text/html\n\n");
                len = atoi(getenv("CONTENT_LENGTH"));
                str1 = (char*)malloc(20);
                str2 = (char*)malloc(20);
                buf = (char*)malloc(len);
                int tryNum =RNUM;
                int lFlag=0;
                fread(buf, 1, len, stdin);

                int ab = 0;
                //printf("len=%d<br>", len);
                //printf("buf=%s<br>", buf);
                tmp = (char*)strtok(buf, "&=");
                str1 = (char*)strtok(NULL, "&=");

                tmp = (char*)strtok(NULL, "&=");
                str2 = (char*)strtok(NULL, "&=");

                printf("ID : %s<br>", str1);
                printf("PW : %s<br>", str2);
                printf("<html><head>PLANETINT LOGIN SYSTEM</head>");
                printf("<body>");
                fp = fopen("../account.dat", "rt");
                if(fp == NULL) {
                        printf("<h2>DB ERROR</h2>\n");
                        return;
                }
   while(feof(fp) == 0)
                {
                        fscanf(fp,"%s", &std[index][0]);
                //      printf("<h2>account info %s</h2>", std[index]);

                        index++;
                }


                index=0;
                while(tryNum > 0)
                {
                if(!strcmp(str1,std[index]) && !strcmp(str2,std[index+1]))
                    {
                        printf("<h2> login success </h2>");
                        lFlag = TRUE;

                        printf("<h2>account id info %s</h2>", std[index]);
                        printf("<script language=\"javascript\">\n");
                        printf("location.href=\"../index.html\"\n");
                        printf("</script>\n");
                        break;
                    }
                else
                    {

                        printf("<h2>tryNum: %d</h2>", tryNum);
                        tryNum--;
                        lFlag = FALSE;
                        index++;
                        printf("<h2>account pw info %s</h2>", std[index]);
                    }
                }
                if(!lFlag)
                {
                        printf("<h2> login false </h2>");
                }


                printf("</body></html>");

                fclose(fp);
}

 

소스를 보면 아시겠지만 폼으로부터 전달되는 아이디와 패스워드를 파싱하여 str1 / str2 에 저장한 후

어카운트 파일을 모두 읽어와 저장한 부분과 매치되는지 반복문을 이용하여 전체 탐색하도록 한 부분 입니다.

중간 중간 디버깅을 위한 printf문이 들어가 있네요 ㅎㅎ 로그인 완료시 자바스크립을 이용하여 다른창으로 이동하도록 location 을 넣었습니다.

 

로그인 소스를 살펴보시면 아시다시피 버그가 눈에 뛸 것 입니다 ㅎㅎㅎ

이부분은 차 후 어드민 로그인 단 한계정만을 사용할 것이기에 귀찮아서 수정하지 않을꺼랍니다 ㅡㅡ;;;

 



앞서 사용자 인증 부분에 대하여 제작을 하였습니다.

풀 소스 공개는 차후 정리가 되는 대로 올리도록 하겠습니다.

여기서는 리눅스 보드에 web을 이용한 네트워크 설정 기능을 만들어 보도록 하겠습니다.

우리가 실생활에서 많이 사용되는 공유기를 보면 대부분 192.168.0.1 이런식으로 접속하여 사용자 인증 을 한 후 공유기 설정을 건드릴 수 있었습니다.

dhcp 기능을 활성화 시킨다던지 고정아이피 세팅을 한다던지 vlan 을 설정한다던지 이런식으로 말이지요.

여기서 제가 구현하고자 하는 기능은 간단히 cgi webserver를 이용한 아이피 및 서브넷 설정 게이트웨이 설정 등의 부분 입니다. 제가 시간이 많지 않은 관계로 짬이 날때마다 글을 이어 올리도록 하겠습니다.

일단 제가 생각하는 webserver를 이용한 아이피 설정의 기능 구현은 이런 형식으로 할 생각합니다.

 

사용자로부터 입력을 받을 폼을 만듭니다. ip 나 sebnet gateway 등의 정보를 입력 받을 수 있으며 리눅스 보드로 부터 현재 설정되어 있는 네트워크 정보를 받아 폼에 표시를 해 줍니다.

사용자로부터 새로운 아이피 및 여타 변경된 네트워크 정보를 받아 submit 버튼을 통하여 cgi 로 넘어온 정보를 파싱하여 제가 만든 배열에 정보를 담아 놓습니다.

그 후 현재 변경하고자 하는 부분의 이더넷 링크를 다운 시킨 후 새로운 네트워크 정보를 입력하여 다시 업링크 시켜 줍니다. 다시 사용자에게 변경된 정보를 폼으로 하여금 보여질 수 있도록 정보를 받아와 표시해줍니다.

==================

2009년 02월 10일

==================

여기까지 제가 구현하고자 하는 부분에 대한 알고리즘을 생각해보았습니다.  다음으로 하나하나 구현을 해보도록 하겠습니다.

리눅스상에서 아이피 확인 및 설정을 하기 위해서는 ifconfig 라는 명령어를 자주 접하게 될 것입니다.

ifconfig 를 통하여 각 이더넷 모듈별로 설정된 아이피 확인 및 서브넷마스크 확인 전송된 패킷량 등 여러 정보를 접하실 수 있습니다.

일단 구현하고자 하는 네트워크 설정 페이지를 만듭니다. html 로 만들게 된다면 초기 현재 설정되어 있는 정보를 받아오지 못하므로 cgi 를 이용하여 c로 만들어야 합니다.

 

networkset.c 라는 파일을 vi 에디터로 생성하여 기본 인클루드 파일 선언 후 cgi 페이지로 인식 할 수 있도록 해줍니다. 다음 c에서 바로 정보를 보기엔 힘든 부분이 있어 시스템함수를 이용하여 따로 작성한 쉘스크립을 불러왔습니다.

쉘스크립의 내용은 다음과 같습니다.

 

ifconfig eth0 > network.info

chmod 4777 network.info

sleep 1

 

쉘스크립이 시작되면 ifconfig eth0 의 명령에 대한 출력을 network.info 라는 파일로 저장합니다.

그 후 network.info 에 4777의 권한을 줍니다.( 유저권한에서 실행 가능할 정도면 될 듯 합니다만 임베디드 시스템에 들어갈 부분이기에 보안에 대한 내용은 잠시 접어두겠습니다 ;;;)

다음 sleep 명령을 이용하여 1초간의 딜레이를 주었습니다.

 

이런식으로 네트워크 정보를 받아오며 생성된 network.info 파일을 c에서 파싱합니다.

akw 를 이용하여 shell 에서 파싱하는 방법이 쉽습니다만.. 제작한 하드웨어의 커널에 awk 를 포함하지 않아  그냥 진행하며 다른 방법을 사용한 것 입니다 ㅡㅡ;;;

c에서 파일을 파싱하여 ip 및 subnetmask 정보를 얻은 후 gateway 정보를 얻어야 합니다. 여러 방법이 있겠지만 실력이 미천한 저는 route 쉘스크립을 만들어 파일로 저장 후 위와 같은 방법으로 파싱하여 정보를 얻어 냈습니다;;

다 끝내고 생각한 방법이지만 이렇게 할바에 커널에 awk 를 올리는 것이 한결 간편했을 거라는 생각이 드는군요 ㅠㅠ 뭐같은 linux gcc 때문에 몇번의 짜증이 솟구쳤지만 이차저차 기본 기능은 구현이 되는군요 -_-

 

===================

2009년 02월 11일

===================

어제에 이어 오늘도 작업을 시작하였습니다.

먼저 ip 정보 및 subnetmask 정보를 ifconfig 를 이용하여 파싱하였습니다.

먼저 ip 정보를 sed 를 이용하여 파싱하였습니다. sed에 대한 사용설명은 여기를 참조하시면 됩니다.

http://stone.backrush.com/sunfaq/ljs007.html 

 

먼저 ifconfig 와 sed 를 이용하여 ip 주소를 파싱해보도록 하겠습니다.

간단히 쉘 스크립을 하나 만듭니다.

#> vi getinfo.s

 

/sbin/ifconfig | sed '/^ *$/d' | sed -ne 's/inet addr:\([0-9.]*\).*/\1/p;' > ip.info

 

이 명령어는 ifconfig 의 실행 결과 중 inet 이라는 문자열을 담고있는 열을 삭제 후 addr을 제외한 그 이후 값을 화면에 출력하며 ip.info 라는 파일로 저장하는 커맨드 입니다.

실행을 시켜보면

xxx.xxx.xxx.xxx

xxx.xxx.xxx.xxx

라고 ip 주소 및 local host 의 주소가 표시될 것 입니다.

이 중 우리가 필요한 값은 ip주소 값 입니다. 일단 냅두고..

다음으로 필요한 값은 subnetmask 값 입니다.

subnetmask 는 ip 주소가 나온 줄 바로 아래줄에 있군요

이것도 역시 ifconfig 와 sed, grep 를 이용하여 파싱하여 보겠습니다.

 

/sbin/ifconfig eth0 | grep Mask | sed "s/^.*Mask://g" > subnet.info

 

위 커맨드는 ifconfig eth0 의 결과 값중 grep를 이용하여 mask 문자열이 들어간 줄을 파싱하여 sed 를 이용 Mask: 다음에 나오는 subnet mask 값을 파싱하여 subnet.info 라는 파일로 저장하게 하는 커맨드 입니다.

저 역시 리눅스는 익숙치 않아 sed 에 대하여 약 20분 정도 공부를 한 후 만들었습니다 -_-;;

 

다음으로 우리가 필요로 하는 ip값고 subnetmask 값이 파일 두개로 출력이 되었습니다.(물론 처음 파일에 필요없는 호스트 정보도 포함되었군요) 이 파일을 하나로 합쳐 c언어로 파싱하기 좋게 하나로 만들겠습니다.

cat 커맨드를이용하면 쉽게 가능 할 것 같네요..

cat subnet.info ip.info | sort | uniq > ifinfo.info

두개의 파일을 하나로 합쳐 ifinfo.info 파일에 저장을 하도록 합니다.

여기까지 우리가 얻고자 하는 ip subnetmask gateway address, remote ip 중 두가지를 구하였습니다.

다음은 gateway address 를 구해보도록 하겠습니다.

gateway address 는 route 라는 커맨드를 이용하여 확인 및 설정 가능 합니다.

#> route | grep default > gw.info

게이트웨이 정보 중 default 라는 문자열이 들어있는 줄을 필터링하여 얻어냅니다. 몇몇 쓰레기 값도 들어가는 군요.(필요없는 값)

다음 아까 만들었던 ifinfo.info 라는 파일과 gateway 정보가 담긴 파일을 cat 커맨드를 이용하여 파일을 합칩니다.

 

cat ifinfo.info gw.info | sort | uniq > network.info

 

두개의 파일을 하나로 합쳐 network.info 라는 파일에 저장을 합니다.

 

이 파일에는 지금까지 우리가 얻으려 하였던 ip 와 subnet, gateway 정보 등이 들어 있습니다.

 

이 파일을 이용 할 c언어로 돌아옵니다.

 

파일을 열고 network.info 파일을 fscanf()를 이용하여 전체 읽어들인 후 문자열 배열에 넣고

원하는 값을 호출하여 사용하면 됩니다.

저는 폼을 만들어 밸류값에 들어가도록 하여 사용 하였습니다.

아래는 sorce 입니다.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define TRUE 1
#define FALSE 0
#define ON 1
#define OFF 0
#define MAX 12000;

int main(int argc, char *argv[])
{
 
 
 FILE *fp;

 printf("Content-type:text/html \n\n");
 int i = 0;
 int index = 0;
 int r = 0;
 unsigned int delay = MAX;
 char ipinfo = 0;
 char subnetinfo = 0;
 char gwinfo = 0;
 char remote = 0;
 char std[100][100];
 char tmp;
 
 setuid(0);   // 유저에게 루트권한을 부여합니다.
 printf("<html>");
 printf("<head> <center>PLANETINT Network Setting </center></head>");
 printf("<body>");
 
 //printf("<h1>get network info</h1>");
 r == system("./getinfo.s"); //시스템 함수를 이용하여 getinfo.s 스크립(각 정보를 파싱하는 스크립)을 실행합니다.
 if( r == -1 )
 {
 printf("<h1> Fail the get network info</h1>");
 }
 else
 {
 //printf("<h1> Success get Network info </h1>");
 }
 
 //printf("REMOTE_ADDR = %s \n", getenv("REMOTE_ADDR"));
 
 fp = fopen("./network.info" , "rt");  // 파싱한 정보들을 모아놓은 network.info 파일을 엽니다.
 
 if(fp == NULL)
 {
 printf("<h1>DB ERROR</h1>");
 return;
 }
 
 while(feof(fp) == 0)
 {
  fscanf(fp,"%s", &std[index][0]);  // 배열에 파일을 모두 읽어 저장합니다.
  //printf("<h1> %s </h1>", std[index]);
  index++;
 }
 sleep(0.5);  // 0.5초간의 딜레이 --;; 가끔 컴퓨터가 느려져 스크립이 제대로 실행되지 않은 상태에서 값을 읽어오는 경우가 있어 0.5초의 딜레이를 줬습니다.
 //printf("<p> <h1> Host : %s</h1></p>",std[0]);
 //printf("<p> <h1> I  P : %s</h1></p>",std[1]);
 //printf("<p> <h1> SUB : %s</h1></p>",std[2]);
 //printf("<p> <h1> G  W : %s</h1></p>",std[4]);
 printf("<center><form name=\"nset\" action=./cgi-bin/netset.cgi method=\"post\">");
 printf("<p> IP ADDR <br> <input type=\"text\" name = \"ipset\" maxlength=\"15\" value=\"%s\"> </p>",std[1]); // 각 정보를 폼에 뿌려줍니다.
 printf("<p> SUBNET  <br> <input type=\"text\" name = \"sebnet\" maxlength=\"15\" value=\"%s\"> </p>",std[2]);
 printf("<p> GATEWAY <br> <input type=\"text\" name = \"gateway\" maxlength=\"15\" value=\"%s\"> </p>",std[4]);
 printf("<p> SystemIP <br> <input type=\"text\" name = \"systemip\" maxlength=\"15\" value=\"%s\"> </p>",getenv("REMOTE_ADDR")); // 환경변수를 이용하여 리모트 주소를 구해 폼에 뿌려줍니다.
 printf(" <input type=\"submit\" name=\"networkchange\" value=\"Change\">");
 printf("<input type=\"reset\" name=\"netinit\" value=\"Reset\">");
 printf("</form>");
 printf("</center> </body>");
 printf("</html>");
 fclose(fp);
 return 0;
 }

 

아주 간단한 소스로 값을 파싱하여 만들 수 있었습니다.

여기에 변경된 값을 받아 처리를 해주는 함수를 만들면 웹상에서 네트워크 설정 기능이 완성이 됩니다.


이번에 임베디드 시스템을 확실히 공부하고자 가지고 있는 순대 보드 이외에
범용보드라 볼 수 있는 삼성 S3C2440 SOC를 사용한 개발 보드를 큰 맘 먹고 구매하였습니다.

가격은 중고로 25만원 정도 들었습니다. ;;;;

한달은 밥 쫄쫄 굶고 다녀야 겠습니다 ;;;; 회사에서 구매한 falinux 의 ez-s3c2440 보드가 있긴 하지만
제 보드가 아니라 생각하니 함부로 만지질 못하는 겁니다.. 자연히 공부 의욕도 떨어지고 계속 순대보드만 가지고 놀았습니다;;;

생김새는 요로코롬 생겼습니다.



공돌이 책상이라 고무 깔판을 책상에 깔아놨습니다 ㅋㅋ
생각외로 작고 귀엽네요...

다음주부터 winCE와 linux 포팅을 시도해볼 생각입니다. ^^



이번 포스팅은 wmware 를 통한 리눅스 설치법을 올리고자 합니다.

wmware 란 ? 

VMware(뉴욕: VMW)는 EMC사의 공식 자회사이며, VMware 워크스테이션(VMware Workstation)과 프리웨어 제품인 VMware ServerVMware Player를 포함한, x86 호환 컴퓨터를 위한 가상화 소프트웨어를 공급한다. 이 회사의 본사는 미국 캘리포니아팰러앨토에 있다. 그리고 R&D 사무소는 미국 캘리포니아의 팰러앨토, 캘리포니아의 샌프란시스코, 메사츄셋 캠브릿지, 그리고 인도뱅걸로에 있다. VMware 소프트웨어는 마이크로소프트 윈도, 리눅스, 그리고 맥 오에스 텐에서 돌아간다.

"VMware"라는 이름과 브랜드가상 머신(Virtual Machine)으로서의 "VM"의 전통적인 해석에 따른 것이다.

VMware는 Diane GreeneMendel Rosenblum이 1998년에 건립했다. Greene은 1978년 MIT에서 조선학 석사 학위를 받았고 1988년에 캘리포니아 대학교 버클리에서 컴퓨터 과학의 두 번째 석사 학위를 받았다. Mendel과 Greene은 스탠퍼드 대학교에 있는 동안 만났다.

2007년 8월 14일에, EMC사는 뉴욕 증권거래소에서 기업공개(IPO)에서 VMware 회사 주식을 10% 공개했다. 이 주식은 주 당 29 달러로 시작했으며 당일 종가는 51 달러였다.

발췌 - http://ko.wikipedia.org/wiki/VMware 

예전엔 리눅스나 여타 운영체제를 인스톨 하기 위해서는 또다른 pc를 이용하여 설치를 하거나 한PC를 사용 할 시에는 멀티 부팅을 이용하여 인스톨을 하였습니다. 하지만 근래엔 vmware의 성능 및 지원 기능이 뛰어나 pc 안에 또다른 pc를 운영 하듯 거의 오류없이 사용이 가능합니다.

여기서는 vmware를 이용한 Linux 중 사용기능이 편리하며 사용자로부터 많이 보급된 우분투9.03 을 인스톨 하는 과정을 보여드립니다.

1 . vmware 설치
 - vmware는 기능에 따라 서버, 데스크탑 등의 버젼으로 나뉘게 됩니다.  여기서 설명하게 될 부분은 데스크탑 버젼 입니다. 데스크탑 버젼은 개인의 pc에 설치하여 다른 tools을 깔지 않고 바로바로 실행을 확인 가능하며 개인이 쓰기에 최적화 된 버젼 입니다.

왼쪽의 화면은 vmware workstation을 설치 한 후 실행을 시킨 화면 입니다.
새로운 가상 PC를 생성하기 위해선 New Virtual Machine을 선택 합니다.











두 가지의 선택 메뉴를 보실 수 있습니다. 1번 메뉴 선택시 간단한 세팅만으로 가상 PC를 만들 수 있다. 또한 하드웨어 옵션 및 여러가지 설정을 변경할 수 있도록 Custom 모드를 지원하여 사용자가 임의의 가상pc 환경을 조작 할 수 있습니다. 여기서 우리는 가상 pc의 사양을 변경하기위해 Custom을 사용합니다.


Custom 선택 후 Next 클릭 시 위와 같은 화면을 볼 수 있습니다. 여기서는 버추얼 머신 생성을 위한 vmware의 버젼을 설정할 수 있습니다. 특별한 경우가 아닐 경우 Workstation6.5를 선택 합니다. 이전 버젼의 경우 생성할 수 있는 가상PC의 하드웨어 사양이 제한적일 수 있습니다.
Next 클릭시 위와 같은 화면을 볼 수 있습니다. 여기서는 인스톨 할 OS의 시디를 넣거나 이미지를 마운트 하기위한 곳 입니다. 또한 마지막 메뉴 선택시 가상PC만 생성되며 OS는 차 후 사용자가 추가를 하여야 합니다.
OS 시디가 있을 경우는 Installer Disc 를 선택 하시고 이미지 화일로 있으실 경우는 Installer disc image file 을 선택합니다. 여기서 우리는 두번째 메뉴인 Installer disc image file 을 선택 후 Browse... 를 눌러 설치 할 OS 이미지 화일을 지정하여 줍니다. 제 경우는 Ubuntu 9.04 버젼을 지정 하였습니다.


이미지 지정 후 Next 를 누르면 위와같은 창을 보실 수 있습니다. 여기서는 리눅스를 인스톨 하기 위한 기본적인 정보를 기입하는 곳으로 텍스트박스를 모두 채우면 Next 버튼이 활성화 됩니다.
이 창에서는 생성할 버추얼 머신의 이름과 가상OS가 저장될 하드디스크 위치를 설정하게 됩니다.
버추얼머신의 이름은 여러대의 버추얼머신 운영시 구분을 위한 것 이므로 위 기입하였던 명칭과 무관하게 원하시는 이름을 지정하시면 됩니다. 로케이션의 경우 최소 2기가의 여유 용량이 있는 디스크에 저장을 해주셔야 리눅스가 원활히 설치 됩니다.


설치할 버추얼 머신의 cpu 갯수 입니다. 리소스를 어디에 많이 할당할지에 따라 cpu를 하나 혹은 두개를 골라 주세요.

제작 될 버추얼 머신의 램 사이즈를 설정하는 곳 입니다. 노란 화살표의 경우 최소 필요 메모리 이며 녹색 화살표는 사용자 지정값, 파란색의 경우 최대 설정 할 수 있는 메모리 용량값 입니다. 일반pc와 마찬가지로 램의 여유 공간이 적을 시 느려지게 됩니다. 512메가 이상 설정하는 것이 원활히 리눅스를 돌리기에 안정적입니다.

Network 설정을 위한 창 입니다. 첫번째의 경우 현재 사용중인 pc와 IP를 공유하여 동일 ip를 사용하게 됩니다.
두번째의 경우 NAT설정을 통한 가상 ip를 사용하게 됩니다. 2번째 메뉴를 선택하여 줍니다.
IDE 및 SCSI Adapter 설정입니다.
특이사항이 없을 경우 LSI Logic 을 선택합니다.

'ARM' 카테고리의 다른 글

FALINUX 공개 세미나 참석  (0) 2009.08.21

어제 (8/20) FALINUX에서 개최하는 공개 세미나에 참석하였습니다.



장소는 위와 같이 서울 양재동 aT센터 였습니다.
주제는 다음과 같은 순서로 이루어 졌습니다.

세미나장 근처엔 falinux 제품군들도 많이 전시해놓고 이번에 새로이 런칭된 ez-s3c6410을 이용한 안드로이드 포팅 제품도 볼 수 있었습니다.
시간이 너무 빡빡하여 강사님들께서 많이 애 쓰신 것 같습니다.
다음번엔 1박2일 이나 2박3일 등 일정으로 잡아서 하면은 좋을 것 같습니다.
좋은 세미나에 친절하신 falinux 분들을 뵈니 참석 잘했구나~ 하는 생각이 드네요.

'ARM' 카테고리의 다른 글

VMWARE Workstation 을 이용한 Linux 설치하기  (0) 2009.08.22

+ Recent posts