https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/power/supply/bq2415x_charger.c



드라이버 링크

'리눅스커널 > Device Driver' 카테고리의 다른 글

USB 인사이드 muosys.egloos.com  (0) 2016.05.16
PS/2 키보드 LED제어  (0) 2015.05.13
문자디바이스 드라이버와 file_operations  (0) 2015.05.12
IOCTL  (0) 2015.05.12
디바이스드라이버기초정리  (0) 2015.05.11

http://muosys.egloos.com/l2

'리눅스커널 > Device Driver' 카테고리의 다른 글

[charger] bq2415x  (0) 2017.06.12
PS/2 키보드 LED제어  (0) 2015.05.13
문자디바이스 드라이버와 file_operations  (0) 2015.05.12
IOCTL  (0) 2015.05.12
디바이스드라이버기초정리  (0) 2015.05.11

학교에서 수업때 배운 내용이지만 다시봐도 새롭다.

쟈료를 가지고 따라가보겠다.

 

- PS/2 제어 레지스터

   PS/2 는 8042 라고 하는 컨트롤러가 제어한다. 이것음 다음과 같은 I/O주소를 갖는다.

 

PORT    READ/Write        Function

0x60        Read                Read Input Buffer

0x60        Write                Write Output Buffer

0x64        Read                Read Status Register

0x64        Write                Send Command

 

 

PS/2 키보드를 제어하기위해 컨트롤러에 명령을 써야 하는데 이때 사용하는 레지스터가 0x64번지 이다.

이번지에 명령을 쓴다. 즉 위의 Send Command 레지스터에 써 넣는다.

   - 0xEE : 에코 요청 명령

   - 0xED: 키보드에 있는  LED를 끄거나 키기 위한 명령

 

키보드에 읽을데이터가 있는가 확인할때는  0x64를 읽으면 된다.

PC 에서 키보드 데이터를 써 넣었다면 8042 입장에서는 input 이므로 비트 0번이 1이된다.

데이터를 써 넣기 전에 비트 0번이 1이 아닌가를 확인하고 써 넣어야 한다.

 

---키보드 응답 또는 전송 데이터 읽기

 

1) 0x64번지의 읽은 값의 비트1을 읽어 1이 될때까지 기다린다.

2) 0x60번지를 읽으면 키보드에서 전송한 데이터를 읽을 수 있다.

 

이때 0x64번지를 읽는 과정에서 문제가생겨 무한루프에 빠지지 않도록 다음과 같이 구현한다.

u8 ps2_key_read_data(void)

 

 

 

--명령 전송 및 응답 데이터 읽기

1) 0x64 번지에 명령을 써 넣는다.

2) 0x64 번지를 읽어 비트 0이 0이 될때까지 기다린다.

3) 0x64 번지를 읽어 비트 1이  1이 될때까지 기다린다.

   키보드가 명령을 받으면 응답데이터를 보내므로 이 값을 얻기위해서 이다.

4) 0x60 번지를 읽으면 키보드에 전송한 데이터를 읽을 수 있다.

 

 

 

 

LED를 키려변 1로 셋한다

0비트 : SCROLL LOCK

1비트 : NUM LOCK

2비트 : CAPS LOCK

 

 

if(0xFA != ps2_key_exchange_data(0x01)) return 0;

 

-버퍼 클리어

 

참고 : B004_다중 소스 모듈과 PS2키보드  - 유영창

'리눅스커널 > Device Driver' 카테고리의 다른 글

[charger] bq2415x  (0) 2017.06.12
USB 인사이드 muosys.egloos.com  (0) 2016.05.16
문자디바이스 드라이버와 file_operations  (0) 2015.05.12
IOCTL  (0) 2015.05.12
디바이스드라이버기초정리  (0) 2015.05.11

IT EXPERT 의 리눅스 디바이스 드라이버  -유영창 - 을 읽으며   정리해 보았다.

 

문자디바이스 드라이버의 특성 바이트 단위로 처리되고, 써넣는 데이터는 보존될 수도 , 보존되지 않을 수도 있다.

 

문자 디바이스 드라이버의 경우

 

char_dev.c

/usr/src/linux-4.0.2/include/linux/fs.h

 

/usr/src/linux-4.0.2/include/linux/types.h"

 

 

typedef long long   __kernel_loff_t;  // 8byte 32bit system

 #if defined(__GNUC__)
typedef __kernel_loff_t     loff_t;
#endif



 

 

 

 

struct module *owner;

- 파일 오퍼레이션의 소유자를 나타낸다. 디바이스 드라이버의 사용 횟수를 커널에서 관리해야 하기 때문에 이 필드를 지정한다. 보통은 THIS_MODULE을 지정한다.

ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

- 디바이스 드라이버의 비동기 읽기를 구현하는 함수를 지정한다. 일반적인 디바이스 드라이버에서는 이 기능을 사용하지 않기 때문에 NULL을 지정한다.

 

문자디바이스 드라이버를 동작하려면 커널에 등록되어 있어야한다.

<linux/fs.h> 헤더파일을 소스에 포함 시켜야 한다.

- register_chrdev : 디바이스를 등록한다.

- unregister_chrdev:등록된 디바이스를 제거한다.

 

 

/usr/src/linux-4.0.2/include/linux/fs.h"

 

 

 

 

 

'리눅스커널 > Device Driver' 카테고리의 다른 글

USB 인사이드 muosys.egloos.com  (0) 2016.05.16
PS/2 키보드 LED제어  (0) 2015.05.13
IOCTL  (0) 2015.05.12
디바이스드라이버기초정리  (0) 2015.05.11
platform_driver  (0) 2015.04.23

아직멀었구나..

 

괜히 최신커널쓴다고 오류만 난발.

오늘도 에러가..

문자 디바이스 드라이버 구조체중에 ioctl()함수가 사라지고 이두개를 사용한다고 한다.

 

.unlocked_ioctl or .compat_ioctl 사용!

 세부정보 : http://forum.falinux.com/zbxe/?document_srl=563022 FF포럼

 

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

 

인자만 한개 지워주니깐 성공. 휴.

세부사항은 검색 하십쇼!

 

디바이스 예제. //ioctl.c

#include <linux/init.h>

#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/fs.h>

 

int kw_device_open(struct inode *inode, struct file *filp)

{

       printk(KERN_ALERT "kw_device open fuction called\n");

       return 0;

}

 

int kw_device_release(struct inode *inode, struct file *filp)

{

       printk(KERN_ALERT "kw_device release fuction called\n");

       return 0;

}

 

//ioctl 연산 구현 부분 기존 read, write연산 제거하고 모두 ioctl 구현

int kw_device_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)

//변형

{

       switch(cmd)

       {

       case 1: //read

             printk(KERN_ALERT "ioctl read...\n");

             break;

       case 2: //write

             printk(KERN_ALERT "ioctl write...\n");

             break;

            

       default:

             printk(KERN_ALERT "ioctl unknown command...\n");

             break;

       }

       return 0;

}

 

//동작만 살펴보기 위해 간단한 메세지만 출력하 였다.

 

static struct file_operations vd_fops ={

             .owner        = THIS_MODULE,

             .open         = kw_device_open,

             .release     = kw_device_release,

             .unlocked_ioctl     = kw_device_ioctl  //변형부분!

};

 

int __init kw_device_init(void){

       // 문자 디바이스를 등록한다.

       if(register_chrdev(250,"kw_device", &vd_fops) <0 )

             printk(KERN_ALERT "driver init failed\n");

       else

             printk(KERN_ALERT "driver init successful\n");

       return 0;

}

 

void __exit kw_device_exit(void){

       unregister_chrdev(250,"kw_device");

       printk(KERN_ALERT "driver cleanup successful!\n");

}

 

module_init(kw_device_init);

module_exit(kw_device_exit);

MODULE_LICENSE("GPL");

 

응용프로그램 //ioctl_app

 

파일 첨부..

 

ioctl.zip

                       책: 리눅스 커널 프로그래밍(한빛) 에서

                             소스작성중.

'리눅스커널 > Device Driver' 카테고리의 다른 글

USB 인사이드 muosys.egloos.com  (0) 2016.05.16
PS/2 키보드 LED제어  (0) 2015.05.13
문자디바이스 드라이버와 file_operations  (0) 2015.05.12
디바이스드라이버기초정리  (0) 2015.05.11
platform_driver  (0) 2015.04.23

 

리눅스버전 3.19.4

 

 

커널에 자원 처리를 요청하는 방법은 시스템 호출    과 파일입출력을 이용하여 드바이스 드라이버를 사용하는 방식

 

 

 

 

/usr/src/linux-3.19.4/include/linux/types.h 의

15 typedef __kernel_dev_t      dev_t;

 12 typedef __u32 __kernel_dev_t;

 

진입점 (entry point, entrance)  IT용어사전, 한국정보통신기술협회

진입점 [entry point, entrance, 進入點] (용어해설)

 1. 어떤 프로그램이나 서브루틴의 시작주소. 즉 제어를 서브루틴으로 옮기기 위해 분기하는 주소이다.

 2. 어떤 서브루틴을 호출 했을 때 그 안에서 제일 먼저 실행되는 명령어

 

 

  • 커널에 모듈 삽입/제거 명령어
      Insmod
    sys_create_module(모듈을 위한 메모리 공간 할당 받음)
    get_kernel_syms(모듈 링크위한 커널 심볼테이블 작업)
    sys_init_module(코드 복사, 모듈의 초기화함수 호출)
  •  rmmod는 내부적으로
    delete_module 호출 → 사용수 카운트가 0 이면
    cleanup_module 호출

/usr/src/linux-3.19.4/Documentation$ vim devices.txt
linux-3.19.4/include/uapi/linux/major.h   에 디바이스에대한 major 즉 주번호 들이 정의되어 있다.

 

실제 사용중인 주번호는 "cat /proc/devices" 를 통해서 확인 가능

root@li:/usr/src/linux-3.19.4/include/uapi/linux# cat /proc/devices
Character devices:
  1 mem        4 /dev/vc/0        4 tty         4 ttyS         5 /dev/tty     5 /dev/console
  5 /dev/ptmx   5 ttyprintk         6 lp         7 vcs         10 misc        13 input
 14 sound/midi   14 sound/dmmidi          21 sg          29 fb            99 ppdev
108 ppp             116 alsa                       128 ptm      136 pts          180 usb
189 usb_device   216 rfcomm                  226 drm       251 hidraw     252 bsg
253 watchdog     254 rtc

 

Block devices:
  1 ramdisk    2 fd       259 blkext       7 loop
  8 sd           9 md11 sr
 65 sd   66 sd 67 sd   68 sd     69 sd   70 sd   71 sd  128 sd           129 sd
130 sd  131 sd   132 sd  133 sd  134 sd
135 sd      252 device-mapper   253 virtblk  254 mdp
 

 

 

 

 

 

참고

 리눅스 디바이스 드라이버-유영창

 심볼 테이블  http://kirari83.tistory.com/entry/EXPORTSYMBOL

 플랫폼디바이스 드라이버 http://blog.naver.com/sigsaly/100102042663

 

 

 

'리눅스커널 > Device Driver' 카테고리의 다른 글

USB 인사이드 muosys.egloos.com  (0) 2016.05.16
PS/2 키보드 LED제어  (0) 2015.05.13
문자디바이스 드라이버와 file_operations  (0) 2015.05.12
IOCTL  (0) 2015.05.12
platform_driver  (0) 2015.04.23

PNP 기능을 플랫폼 드라이버라는 형태로 지원한다.

 

드라이버의 기본동작을 구현하기 위한 자료구조체

/usr/src/linux-3.19.4/include/linux/platform_device.h

 

174 struct platform_driver {
175     int (*probe)(struct platform_device *);
176     int (*remove)(struct platform_device *);
177     void (*shutdown)(struct platform_device *);
178     int (*suspend)(struct platform_device *, pm_message_t state);
179     int (*resume)(struct platform_device *);
180     struct device_driver driver;
181     const struct platform_device_id *id_table;
182     bool prevent_deferred_probe;
183 };

 

490 #define PLATFORM_NAME_SIZE  20
491 #define PLATFORM_MODULE_PREFIX  "platform:"
492    
493 struct platform_device_id {
494     char name[PLATFORM_NAME_SIZE];
495     kernel_ulong_t driver_data;
496 };  

 

 

보통 사용 예

 static struct platform_driver test_driver=

{

  .probe = test_probe,

  .remove= test_remove,

  .suspend= test_suspend

  .resume = test_resume,

  .driver ={

              .name = TEST_DEVICE_DRIVER_NAME,

  },

};

 

 

  • probe() 디바이스가 추가 되었을 때 처리하는 함수를 지정
  • remove() 디바이스가 제거 되었을 때 처리하는 함수를 지정
  • shutdown() 디바이스의 동작을 중지 시킬때 처리하는 함수
  • resume() 디바이스의 동작을 재시작 시킬 때 처리하는 함수
  • driver 구조체 내부의 name 필드만 보통 지정, 나머지 필드는 커널 내부에서 관리되면서 채워진다.
  • id_table  probe()함수가 호출되는 과정에서 해당 디바이스를 구별하고 처리하기 위한 내부 데이터를 지정하는 목적

 

 

 

플랫폼 드라이버 구조체 정보는 다음과 같은 함수로 커널에 등록되거나 제거된다.

  • int platform_driver_register(struct platform_driver *pdev);
  • void platform_dirver_unregister(struct platform_driver *pdev);

 

    platform_driver_register() 함수는  : pdev 정보를 커널 내부에 등록하기 위해서 사용되므로 보통 모듈 초기화 함수에서 사용된다. 반환값이 0이면 정상이다.

 


188 /*
189  * use a macro to avoid include chaining to get THIS_MODULE
190  */
191 #define platform_driver_register(drv) \
192     __platform_driver_register(drv, THIS_MODULE)
193 extern int __platform_driver_register(struct platform_driver *,
194                     struct module *);
195 extern void platform_driver_unregister(struct platform_driver *); 

 

 32 #ifdef MODULE
 33 extern struct module __this_module;
 34 #define THIS_MODULE (&__this_module)
 35 #else
 36 #define THIS_MODULE ((struct module *)0)
 37 #endif

 

다른버전 ----4.0.2

/usr/src/linux-4.0.2/drivers/base/platform.c

 

 

 

 

 

 

 

 

참조 : B003_디바이스 드라이버 모듈 (유영창)

 

 

 

'리눅스커널 > Device Driver' 카테고리의 다른 글

USB 인사이드 muosys.egloos.com  (0) 2016.05.16
PS/2 키보드 LED제어  (0) 2015.05.13
문자디바이스 드라이버와 file_operations  (0) 2015.05.12
IOCTL  (0) 2015.05.12
디바이스드라이버기초정리  (0) 2015.05.11

+ Recent posts