Linux API/joystick2012. 2. 5. 11:36
조이스틱 관련 구조체 및 매크로 내용
우분투 기준 /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
 
값이 변하기 전에는 새로운 값은 읽히지 않는 듯 하고,
그런 이유로 예제 파일이 멀티쓰레드로 구성이 된 것으로 생각된다. 

'Linux API > joystick' 카테고리의 다른 글

linux force feedback  (0) 2022.06.15
리눅스에서 조이스틱 값 읽어오기  (0) 2012.02.04
Posted by 구차니
프로그램 사용/coLinux2009. 8. 31. 16:57
colinux portalb ubuntu를 사용중인데, 이녀석은 별다른 설정이 없음에도 불구하고
항상 아이피가 10.0.2.15로 잡힌다.

$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:ff:75:39:d3:c1 
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::2ff:75ff:fe39:d3c1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:12902 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15244 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1303825 (1.2 MB)  TX bytes:7004618 (6.6 MB)
          Interrupt:2

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:2004 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2004 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:572264 (558.8 KB)  TX bytes:572264 (558.8 KB)

portable_ubuntu.conf 파일의 내용에는 아래의 내용뿐이다.
eth0=slirp,00:ff:75:39:D3:C1,tcp:22:22
slirp를 통해서 외부로 접속을 하고,
맥 어드레스와 외부로 22번 포트를 열어주어 ssh 접속이 가능하도록 한다는 의미를 지닌다.

아무튼 ip에 신경쓰지 않고 로컬 포트처럼 사용하려면 위의 eth0의 마지막 tcp:22:22 뒤에 / 를 붙이고 붙여주면 된다.
예를 들어 tftp를 열어주고 colinux의 tftpd에 접속하도록 하고 싶다면
eth0=slirp,00:ff:75:39:D3:C1,tcp:22:22/udp:69:69
라고 입력해주면 된다.

[링크 : http://docs.blackfin.uclinux.org/doku.php?id=colinux:network]
[링크 : http://minangel.tistory.com/228] <- 원문 추적 실패
[링크 : http://colinux.wikia.com/wiki/Network]

'프로그램 사용 > coLinux' 카테고리의 다른 글

Portable Ubuntu TRES / ubuntu 9.10  (6) 2010.05.07
colinux와 UML  (0) 2010.01.23
ubuntu inetd.conf - tftp  (0) 2009.08.31
colinux portable ubuntu 용량 증설하기  (0) 2009.08.31
portable ubuntu (colinux) fstab  (0) 2009.08.31
Posted by 구차니
프로그램 사용2009. 6. 4. 19:24
JPEG 하면 EXIF가 먼저 떠오르는건 디카의 위력일려나..

[jhead : http://www.sentex.net/~mwandel/jhead/]
[libexif : http://sourceforge.net/projects/libexif]
[libjpeg exif patch : http://sylvana.net/jpegcrop/exifpatch.html]
Posted by 구차니
Linux2009. 5. 28. 15:06


위의 사진은 공식 페이지에서 슬쩍..
그런데 어디서 많이 보던 디자인이다 싶긴한데.. frhex보단 조금 불편할 것 같기도 하고..
아무튼.. 서버도 ubuntu로 바꾸어 버릴까 고민이 드는 하루다.




[링크 : http://live.gnome.org/Ghex]
[링크 : http://ftp.gnome.org/pub/GNOME/sources/ghex/2.24/]
Posted by 구차니
프로그램 사용/u-boot2009. 3. 25. 18:51

14.3.27. How can I access U-Boot environment variables in Linux?

Question:
I would like to access U-Boot's environment variables from my Linux application. Is this possible?

Answer:
Yes, you can. The environment variables must be stored in flash memory, and your Linux kernel must support flash access through the MTD layer. In the U-Boot source tree you can find the environment tools in the directory tools/env, which can be built with command:

make env

For building against older versions of the MTD headers (meaning before v2.6.8-rc1) it is required to pass the argument "MTD_VERSION=old" to make:

make MTD_VERSION=old env

The resulting binary is called fw_printenv, but actually includes support for setting environment variables too. To achieve this, the binary behaves according to the name it is invoked as, so you will have to create a link called fw_setenv to fw_printenv.

These tools work exactly like the U-Boot commands printenv resp. setenv You can either build these tools with a fixed configuration selected at compile time, or you can configure the tools using the /etc/fw_env.config configuration file in your target root filesystem.

[링크 : http://www.denx.de/wiki/view/DULG/HowCanIAccessUBootEnvironmentVariablesInLinux]

2010.03.11 추가
간단하게 말하자면 eboot 소스트리에서
u-boot/tools/env 에서
fw_env를 컴파일 하게 되면
fw_setenv
fw_getenv 파일이 생성된다. (물론 하나는 심볼릭 링크이다)

2009/07/18 - [프로그램 사용/u-boot] - U-Boot 환경변수 읽어오기 (u-boot environment variable)

Posted by 구차니
Linux2008. 12. 19. 20:05
man find

       -type c
              File is of type c:

              b      block (buffered) special

              c      character (unbuffered) special

              d      directory

              p      named pipe (FIFO)

              f      regular file

              l      symbolic link; this is never true if the -L option or the -follow option is in effect,
                     unless  the symbolic link is broken.  If you want to search for symbolic links when -L
                     is in effect, use -xtype.

              s      socket

              D      door (Solaris)


'ls -l'을  실행하면
$ ll
total 1922
drwxr-xr-x   2 root root    4096 Nov 15 04:17 bin
drwxr-xr-x   4 root root    1024 Apr 11  2008 boot
drwxr-xr-x  12 root root    3900 Nov 14 13:07 dev
drwxr-xr-x 101 root root   12288 Dec 15 04:15 etc
drwxr-xr-x  10 root root    4096 Aug 19 13:59 home
drwxr-xr-x  14 root root    4096 Apr 11  2008 lib
drwx------   2 root root   16384 Apr 10  2008 lost+found
drwxr-xr-x   2 root root    4096 Nov 14 13:07 media
drwxr-xr-x   2 root root       0 Nov 14 13:07 misc
drwxr-xr-x   2 root root       0 Nov 14 13:07 mnt
drwxr-xr-x   2 root root       0 Nov 14 13:07 net
drwxr-xr-x   2 root root    4096 Jun 19  2008 nfsroot
drwxr-xr-x   3 root root    4096 May 29  2008 opt
dr-xr-xr-x 195 root root       0 Nov 14 13:06 proc
drwxr-x---  29 root root    4096 Dec 17 11:00 root
drwxr-xr-x   2 root root   12288 Apr 11  2008 sbin
drwxr-xr-x   2 root root    4096 Apr 10  2008 selinux
drwxr-xr-x   2 root root    4096 Oct 11  2006 srv
drwxr-xr-x  12 root root       0 Nov 14 13:06 sys
drwxr-xr-x   2 root root    4096 Dec 17 13:30 tftpboot
drwxrwxrwt  16 root dev    90112 Dec 19 20:01 tmp
drwxr-xr-x  15 root root    4096 May 30  2008 usr
drwxr-xr-x  24 root root    4096 Apr 10  2008 var

이런식으로 퍼미션과 파일의 종류가 출력이 된다.
아무튼 일반적으로 보이는 녀석들은

- 일반 파일
b Block device
c Character device
d Directory
l symbolic Link

인데 드물게 보이는 녀석들이 존재 한다.
prw------- 1 morpheuz dev        0 Jul 15 13:21 initctl
crw-rw---- 1 morpheuz dev  61,   0 May 30  2008 lirc
srwxr-xr-x 1 morpheuz dev        0 Oct 20 19:57 lircd
brw-rw---- 1 morpheuz dev   7,   0 May 30  2008 loop0

이 녀석들의 의미는 역설적이게도.. find에서 찾아 냈다.

p name Pipe
s Socket


Posted by 구차니
Linux2008. 12. 16. 17:35
굳이 파일이 존재 하는지 확인을 하려면

1. fopen()의 리턴값을 확인한다.
FILE *fopen(const char *path, const char *mode);
FILE 포인터로 리턴을 하는데 open 실패시 NULL을 리턴하며, errno에 에러를 기록함.

2. access()로 확인한다.
int access(const char *pathname, int mode);
리턴값을 바로 확인하면 됨.

3. fstat()의 리턴값을 확인한다
int fstat(int filedes, struct stat *buf);
리턴값을 바로 확인하면 됨.

구차니즘을 털고 2008.01.06일 테스트
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <time.h>
int main()
{
        int ret = 0;
        clock_t before;
        clock_t after;
        double res;
        FILE *fp;
        struct stat st;

        before = clock();
        fp = fopen("test.txt","rb");
        after = clock();
        printf("%d - %d = %d tick\n",after, before,after - before);

        before = clock();
        ret = access("test2.txt",F_OK);
        after = clock();
        printf("%d - %d = %d tick\n",after, before,after - before);

        before = clock();
        ret = stat("test3.txt",&st);
        after = clock();
        printf("%d - %d = %d tick\n",after, before,after - before);

        return 0;
}

로 테스트 하는데, 전부 0 tick이 나온다 ㄱ-
결론은 어느걸 쓰던지 현존 시스템에서는 지장이 없다는 의미인데, 임베디드에서 쓰기 위해서는
조금 더 자세히 조사를 해봐야 할 듯 하다.

dmesg | grep CPU
CPU0: Intel(R) Pentium(R) 4 CPU 3.40GHz stepping 0a

$ time ./a.out
0 - 0 = 0 tick
0 - 0 = 0 tick
0 - 0 = 0 tick

real    0m0.001s
user    0m0.000s
sys     0m0.001s

이래저래 측정이 안되는건 마찬가지 ㄱ-




fopen(open) / access / fstat 에러 모음은 아래 클릭!


'Linux' 카테고리의 다른 글

ls 명령어의 file type  (0) 2008.12.19
쉘 스크립트 명령어 . (meaning of dot in sheel script)  (0) 2008.12.18
execl() - excute a file  (0) 2008.12.08
fork : Not Enough Memory  (2) 2008.12.08
mkfs - ext2 & ext3  (4) 2008.11.21
Posted by 구차니
Linux2008. 12. 8. 15:56
리눅스에서 프로그램을 실행 시키는 방법은
fork() / exec() 로 하는 방법과 system() 으로 하는 방법이 있다고 한다.
(내가 직접해본게 아니니 발뺌하기 모드 -.-v)

아무튼 fork()의 경우 parent 의 메모리를 복사해서(COW - Copy On Write) 사용하므로 메모리의 낭비가 생기는데,
이런 이유로 메모리가 넉넉해 보임에도
"fork 시에 ENOMEM 을 뱉어 내고 실행을 못한다"면 fork 대신에 vfork를 사용하면 된다.


어플리케이션 서브프로세스를 생성할때 메모리 사용량 최대로 줄이기
Greg Nakhimovsky, 2006년 5월

Fork의 퍼포먼스
...
fork()exec() 에 뒤따라 바로 살행되는 fork/exec 모델의 단점을 다루기 위해 버클리 버젼의 유닉스(BDS)는 1980년대 초반에 vfork() 시스템 콜을 내놓았습니다. vfork(2)부모 프로세스를 자식 프로세스에 카피하지 않습니다. 두 프로세스가 모두 부모의 가상 주소 공간을 공유 합니다; 부모 프로세스는 자식 프로세스가 종료 되거나 exec() 를 호출할때 까지 정지 상태로 들어 갑니다.
...
오랜 시간이 지난후에 멀티쓰레딩(MT)이 가능해 지고 많이 사용되면서 vfork() 가 어플리케이션이 여러개의 쓰레드를 가지고 있을때 새로운 문제를 일으킬 수 있음이 밝혀 졌습니다: 데드락.

메모리 overcommit: 솔라리스 vs 다른 운영체제들

몇몇 운영체제 (리눅스, IBM AIX, HP-UX 같은) 들은 memory overcommit 이라는 기능을 가지고 있습니다.( lazy swap allocation 이라고도 불림) memory overcommit 모드에서 malloc()스왑스페이스를 예약하지 않고 시스템에 충분한 VM이 있든 없든 항상 NULL 이 아닌 포인터를 리턴 합니다.

...

리눅스 커널 버젼 2.6과 그후에 버젼에서는 이론적으로 커널의 동작을 수정할 수 있는 방법이 존재 합니다. 그러므로 overcommit memory 가 발생하지 않을 것입니다. 이것은 strict overcommit modesysctl을 통해 조정함으로써 가능합니다:

sysctl -w vm.overcommit_memory=2

혹은 동일한 의미를 가지고 있는 vm.overcommit_memory=2/etc/sysctl.conf 에 삽입합니다.



[출처 : http://kr.sun.com/developers/solaris/techdocs/subprocess.html]

 Memory overcommit is a Linux kernel feature that lets applications allocate more memory than is actually available. The idea behind this feature is that some applications allocate large amounts of memory "just in case", but never actually use it. Thus, memory overcommit allows you to run more applications than actually fit in your memory, provided the applications don't actually use the memory they've allocated. If they do, then the kernel terminates the application.

[출처 : http://www.gnu.org/software/gnusound/Documentation/ar01s05.html]



Posted by 구차니
Linux2008. 11. 10. 15:11
리눅스에서 파일을 완전 소거 하는 방법이 필요 해서 검색을 해봤더니
sourceforge project로 SRM이라는 것이 발견 되었다.

rpm 버전이 있는지는 모르겠고,
make install로 설치를 하도록 되어 있다.

 srm(1)                                                                  srm(1)

NAME
       srm - securely remove files or directories

SYNOPSIS
       srm [OPTION]... FILE...

DESCRIPTION
       srm  removes each specified file by overwriting, renaming, and truncat-
       ing it before unlinking. This prevents other people from undeleting  or
       recovering  any  information  about  the file from the command line. By
       default srm uses 35 passes to overwrite the file?셲  contents.  If  this
       seems  overkill  you  can  use  use  the --dod or --openbsd or --simple
       option which use less passes.

       srm, like every program that uses the  getopt  function  to  parse  its
       arguments,  lets  you  use the -- option to indicate that all following
       arguments are non-options.  To remove a file called ??f??in the current
       directory, you could type either
              rm -- -f
       or
              rm ./-f

OPTIONS
       Remove (unlink) the FILE(s).

       -d, --directory
              ignored (for compatability with rm(1))

       -f, --force
              ignore nonexistent files, never prompt

       -i, --interactive
              prompt before any removal

       -r, -R, --recursive
              remove the contents of directories recursively

       -s, --simple
              only overwrite the file with a single pass of random data

       -P, --openbsd
              OpenBSD  compatible  rm. Overwrite regular files before deleting
              them.  Files are overwritten three times, first  with  the  byte
              pattern  0xff,  then  0x00, and then 0xff again, before they are
              deleted.  Files with multiple links will  be  unlinked  but  not
              overwritten.

       -D, --dod
              Dod compliant 7-pass overwrite.

       -v, --verbose
              explain what is being done

       -h, --help
              display this help and exit

       -V, --version
              output version information and exit

NOTES
       srm can not remove write protected files owned by another user, regard-
       less of the permissions on the directory containing the file.

       Development and discussion of srm  is  carried  out  at
       http://source-forge.net/project/?group_id=3297   which   is   also   accessible   via
       http://srm.sourceforge.net.

SEE ALSO
       rm(1)

Matt Gauthier                        1.2.9                              srm(1)


윈도우용 완전 소거 프로그램과 비슷하게
소거 알고리즘에 의해서 7pass / 35pass으로 삭제 하며, 기본값은 35pass 라고 되어 있다.

[주소 : http://srm.sourceforge.net/]

----
2011.10.24 추가
우분투에서는 secure-delete 패키지로 존재한다. 
Posted by 구차니
Linux/Fedora Core2008. 11. 7. 12:15
생각을 해보니.. 회사 서버랑은 Fedora Core 8 이었는데..
일단 조금은더 Ubuntu 스러워졌다.(욕아님)

일단 보안 강화를 위해서 Gnome 자체에서 권한을 상당히 자주 물어 보게 되고,
X-windows 로그인시 Root로 로그인을 할 수 없다.(LiveCD에서 이미 겪었었지만..
실제 Live가 아닌 것에도 적용이 될줄이야 ㄱ-)

결정적으로 SCIM이 없다(다국어 입력기). 한글로 설정하면 한글은 잘나오는데 입력할 방법이 없다 ㄱ-

검색을 해보니 SCIM으로는 linux 네이트온 한글 입력이 안된다고 하는데
nabi 라는 녀석을 추천해 주던데 이녀석은 libhangul.so 종속성 땜시 이것저것 요청해서 귀차니즘.



결론 : 리눅스는 역시.. gcc 없으면 단팥없는 호빵.. 프로그램 설치를 위해서라도 반드시 gcc가 필요 하다
결론2 : 그러니까 오늘 다시 포맷 OTL 덤으로 윈도우로 파티션 조정? ㅠ.ㅠ
Posted by 구차니