driverlib 관련 분석 내용 / uart 예제사용
전반적으로 초기화 설정을 보면 무언가.. 중복되도록 설정하는 느낌?
특히 UART의 경우에는 몇단계를 통해서 설정을 하는 것을 보면...
함수설명
extern void SysCtlClockSet(unsigned long ulConfig); // 클럭설정을 하도록 함.
extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); // 포트를 사용하도록 설정함 extern void GPIOPinConfigure(unsigned long ulPinConfig); // GPIO로 쓸지 하드웨어 내장 기능을 쓸지 설정함
extern void GPIOPinTypeGPIOInput(unsigned long ulPort, unsigned char ucPins); // 해당 포트의 해당핀을 입력용으로 설정
extern void GPIOPinTypeGPIOOutput(unsigned long ulPort, unsigned char ucPins); // 해당 포트의 해당핀을 출력용으로 설정
extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, unsigned long ulStrength, unsigned long ulPadType);
// 해당 포트의 해당핀에 대한 GPIO 드라이브 전류와 pull-up / open-drain 설정
예제설명
int main(void)
{
char cThisChar;
// 시스템 클럭설정
SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
// UART0 기능을 사용하도록 함
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
// UART 핀이 포함된 GPIOA 포트를 사용하도록 함
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
// GPIO A의 0번 핀을 U0 RX로 사용하도록 함
GPIOPinConfigure(GPIO_PA0_U0RX);
// GPIO A의 1번 핀을 U0 TX로 사용하도록 함
GPIOPinConfigure(GPIO_PA1_U0TX);
// GPIO A의 0번 1번 핀을 UART에 할당함
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
// UART의 클럭소스와 Baudrate등을 설정함
UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200,
(UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE));
do
{
// UART0로 부터 1문자를 받아옴(blocking 방식)
cThisChar = UARTCharGet(UART0_BASE);
// 받아온 문자을 UART0로 출력함
UARTCharPut(UART0_BASE, cThisChar);
} while((cThisChar != '\n') && (cThisChar != '\r'));
return(0);
}
게임산업 관련하여 시끌벅적해서 블로그 지인들이 글을 많이 쓰니 유행에 편승(!)하여
타칭 게임중독자였던 구차니군의 생각을 털어놓기? ㅋ
왜 애들은 게임을 좋아하는 걸까?
가장 단순하면서도 어른의 입장에서 이해를 하지 못하는 이유는 "즐겁기 때문"이 아닐까 생각이 된다.
게임은 재미있기 때문에 하는것이고, 이러한 재미로 인해 빠져들게 된다. 물론 그 재미의 이면에는 인간의 욕구를 충실히 충족시켜주기 때문이다. 과거의 "오락"에 중점을 두자면 구슬치기 등은 더 좋은 구슬이나 더 많은 구슬을 가지게 되는 "소유욕"을 충족시켜 주고, 더욱 현란하게 더욱 정교하게 하면서 주변의 인정을 받는 "인정욕"도 충족을 받게 된다. 물론 이러한 구조는 현대의 PC 온라인 게임에도 동일하다. 아이템을 소유하고, 더 강해지면서 랭킹이 오르면서 타인의 입에 오르내리게 되고 그러면서 명성을 얻게 된다. (혹은 PK를 통해 악명이 높아져도 타인의 입에 오르내리니)
그렇다면 왜 애들이 게임에 빠지게되는 걸까?
과거에는 몸으로 뛰어오는 오락이 있었고, 그렇게 몸으로 움직이며 스트레스를 풀 수 있었지만 현대에 있어서는 학교 - 학원 - 집 = 잠 이라는 경로만으로 고정되어 있기 때문에 흥미를 느낄수가 없다. 소유욕/인정욕을 넘어서야 그 다음 단계의 욕구인 자아실현욕으로 넘어가는데 소유욕과 인정욕은 거세 당한채 "부모의 자아실현욕"을 투영시켜 아이에게 상위 단계만을 요구한다. 이러한 과정에서 아이들은 상위욕구에 대한 갈망은 반발심리로 바뀌고 저수준의 말초적인 소유욕/인정욕에 목을 매게 된다. 쾌락을 얻는 도구로서의 온라인 게임들은 매우 적절한 수단이며. 이러한 자기 욕구를 충족시키기 위해 게임에 빠져들수 밖에 없게 된다. 온라인에 빠지지 않게 되면 옷 브랜드라던가 신상 IT기기 등을 통해 소유욕/인정욕에 빠지게 된다.
그렇다면 왜 어른들이 온라인 게임을 싫어하는 걸까?
과거는 몸으로 하는 게임이었고, 몸을 잘 쓰는건 능력으로서 인정을 받았던 시대이다. 그러한 시대를 살던 분들에게 있어 오락은 게임이고 게임은 밖에 나가서 몸으로 뛰어놀아야 건전해 보이는 경향이 있다. 우중충하고 어두운 곳에서 모니터만 바라보고 하는 게임으로서는 어둠의 자식이라고 밖에 생각이 들지 않고, 컴퓨터를 잘 모르는 부모세대로서는 자신이 통제할수 없고 이해할수 없는 컴퓨터 자체를 적으로 인식하고 배척할수 밖에 없다. 그래서 통제해준다는 프로그램에 빠져들게 되고 이러한 프로그램들을 통해서 아이들과 더 멀어질수 밖에 없게 된다. 문제는 아이들의 욕구를 충족해줄수도 없으면서 수단을 가로막으면서 부모가 아이와 놀아주지 않는다는 점이다.
그럼 어떻게 하는게 좋을까?
이상적으로는 경제 / 교육체제를 전부 갈아 엎어야 하겠지만, 최소 한도로 제한을 해서 고르자면 다음이 최소한의 노력이 아닐까 싶다. 1. 자기가 좀 피곤해도 아이와 이야기 하는 시간을 조금씩 늘리기 2. 회사에서는 무의미한 야근 하지 않도록 하기 3. 컴퓨터에 익숙해지고 아이와 함께 게임을 해보기 4. 가끔은 아이와 함께 같이 놀러가기 5. 가끔은 부모의 어릴적 오락을 같이 아이와 하기 6. 학원만 보내고 다했다고 하기 보다는 책도 사주고 같이 무언가도 만들어 보기
어쩌면 물질/자본주의 1세대 부모의 같이 놀아주지 못하니 돈으로라도 교육을 잘 시켜주는게 아이에게 잘하는 것이다 라는 생각이 근본원인이고, 이에 파생된 과잉 교육열풍(부모의 죄책감의 상품화) / 학교 강제 야간 자율학습(부모의 편의를 위해 학교에 돈을 주고 묶어둠) / 관심부족으로 인한 인격 미성숙 등의 문제가 결과가 아닐까 싶어진다.
아이들의 범죄도 점점 성인범죄 수준을 넘나들고 있지만 그 아이들만을 처벌할 수도 없고, 부모도 같이 처벌을 해야하지만 이미 삐뚜러진 심성을 어떻게 다시 두드려 펼지는 어른들이 고민해야 할 몫이 아닐까 생각된다. 가짜 인권주의자들의 외침만 들을게 아니라 진심됨 사랑의 매가 부활하는게 답일지도...
조이스틱 관련 구조체 및 매크로 내용
우분투 기준 /usr/include/linux/joystick.h 에 존재함.
#ifndef _LINUX_JOYSTICK_H
#define _LINUX_JOYSTICK_H
/*
* Copyright (C) 1996-2000 Vojtech Pavlik
*
* Sponsored by SuSE
*/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to vojtech@suse.cz, or by paper mail:
* Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
*/
#include "linux/types.h"
#include "linux/input.h"
/*
* Version
*/
#define JS_VERSION 0x020100
/*
* Types and constants for reading from /dev/js
*/
#define JS_EVENT_BUTTON 0x01 /* button pressed/released */
#define JS_EVENT_AXIS 0x02 /* joystick moved */
#define JS_EVENT_INIT 0x80 /* initial state of device */
struct js_event {
__u32 time; /* event timestamp in milliseconds */
__s16 value; /* value */
__u8 type; /* event type */
__u8 number; /* axis/button number */
};
/*
* IOCTL commands for joystick driver
*/
#define JSIOCGVERSION _IOR('j', 0x01, __u32) /* get driver version */
#define JSIOCGAXES _IOR('j', 0x11, __u8) /* get number of axes */
#define JSIOCGBUTTONS _IOR('j', 0x12, __u8) /* get number of buttons */
#define JSIOCGNAME(len) _IOC(_IOC_READ, 'j', 0x13, len) /* get identifier string */
#define JSIOCSCORR _IOW('j', 0x21, struct js_corr) /* set correction values */
#define JSIOCGCORR _IOR('j', 0x22, struct js_corr) /* get correction values */
#define JSIOCSAXMAP _IOW('j', 0x31, __u8[ABS_MAX + 1]) /* set axis mapping */
#define JSIOCGAXMAP _IOR('j', 0x32, __u8[ABS_MAX + 1]) /* get axis mapping */
#define JSIOCSBTNMAP _IOW('j', 0x33, __u16[KEY_MAX - BTN_MISC + 1]) /* set button mapping */
#define JSIOCGBTNMAP _IOR('j', 0x34, __u16[KEY_MAX - BTN_MISC + 1]) /* get button mapping */
/*
* Types and constants for get/set correction
*/
#define JS_CORR_NONE 0x00 /* returns raw values */
#define JS_CORR_BROKEN 0x01 /* broken line */
struct js_corr {
__s32 coef[8];
__s16 prec;
__u16 type;
};
/*
* v0.x compatibility definitions
*/
#define JS_RETURN sizeof(struct JS_DATA_TYPE)
#define JS_TRUE 1
#define JS_FALSE 0
#define JS_X_0 0x01
#define JS_Y_0 0x02
#define JS_X_1 0x04
#define JS_Y_1 0x08
#define JS_MAX 2
#define JS_DEF_TIMEOUT 0x1300
#define JS_DEF_CORR 0
#define JS_DEF_TIMELIMIT 10L
#define JS_SET_CAL 1
#define JS_GET_CAL 2
#define JS_SET_TIMEOUT 3
#define JS_GET_TIMEOUT 4
#define JS_SET_TIMELIMIT 5
#define JS_GET_TIMELIMIT 6
#define JS_GET_ALL 7
#define JS_SET_ALL 8
struct JS_DATA_TYPE {
__s32 buttons;
__s32 x;
__s32 y;
};
struct JS_DATA_SAVE_TYPE_32 {
__s32 JS_TIMEOUT;
__s32 BUSY;
__s32 JS_EXPIRETIME;
__s32 JS_TIMELIMIT;
struct JS_DATA_TYPE JS_SAVE;
struct JS_DATA_TYPE JS_CORR;
};
struct JS_DATA_SAVE_TYPE_64 {
__s32 JS_TIMEOUT;
__s32 BUSY;
__s64 JS_EXPIRETIME;
__s64 JS_TIMELIMIT;
struct JS_DATA_TYPE JS_SAVE;
struct JS_DATA_TYPE JS_CORR;
};
#endif /* _LINUX_JOYSTICK_H */
실험적으로 소스를 짜서 해보니
버튼은 type 1
value는 0(눌리지 않음) 1(눌림)
number는 버튼 번호(1번 버튼은 0번 부터 시작)
X/Y/Z 축은 type 2
좌우는 number 0
앞뒤는 number 1
쓰로틀은 number 2
러더는 number 3
햇좌우 number 5
햇앞뒤 number 6
값이 변하기 전에는 새로운 값은 읽히지 않는 듯 하고,
그런 이유로 예제 파일이 멀티쓰레드로 구성이 된 것으로 생각된다.