Linux 에서 LCD 구동 구조 분석

Linux 2.6 커 널 에서 LCD 구동 구조 에 대한 분석 은 회사 프로젝트 가 xx 방안 이기 때문에 이 를 이용 하여 분석 하고 s3c 2410 의 구동 에 두 어 비교 해 보면 문제 가 없 을 것 이다.
    구동 을 분석 하기 전에 먼저 몇 개의 LCD 구동 중의 몇 가지 중요 한 데이터 구 조 를 파악 하고
 1、struct fb_info 데이터 구조 (FBI)
1  struct fb_info 
2  { 
3     int node; 
4     int flags; 
5     struct fb_var_screeninfo var; /*     */ 
6     struct fb_fix_screeninfo fix; /*     */ 
7     struct fb_monspecs monspecs; /*      */ 
8     struct work_struct queue; /*         */ 
9     struct fb_pixmap pixmap; /*     mapper */ 
10    struct fb_pixmap sprite; /*     mapper */ 
11    struct fb_cmap cmap; /*       */ 
12    struct list_head modelist;  
13    struct fb_videomode *mode; /*    video   */ 
14  
15    #ifdef CONFIG_FB_BACKLIGHT 
16       struct mutex bl_mutex; 
17       /*          */ 
18       struct backlight_device *bl_dev; 
19       /*      */ 
20       u8 bl_curve[FB_BACKLIGHT_LEVELS]; 
21     #endif 
22  
23     struct fb_ops *fbops; /* fb_ops,      */ 
24     struct device *device; 
25     struct class_device *class_device; / 
26     int class_flag; /*   sysfs   */ 
27     #ifdef CONFIG_FB_TILEBLITTING 
28         struct fb_tile_ops *tileops; /*   Blitting */ 
29     #endif 
30     char _  _iomem *screen_base; /*       */ 
31     unsigned long screen_size; /* ioremapped        */ 
32     void *pseudo_palette; /*  16     */ 
33     #define FBINFO_STATE_RUNNING  0 
34     #define FBINFO_STATE_SUSPENDED         1 
35     u32 state; /*     ,    */ 
36     void *fbcon_par; 
37     void *par; 
38 }; 

    FBI 에 서 는 프레임 버퍼 장치 의 모든 정 보 를 기 록 했 는데 장치 의 설정 매개 변수, 상태 와 조작 함수 지침 을 포함한다.모든 프레임 버퍼 장 치 는 FBI 에 대응 해 야 합 니 다.
2.fb_ops 구조 체 FBI 의 구성원 변수 fbops 는 바 텀 작업 을 가리 키 는 함수 의 지침 입 니 다. 이 함수 들 은 드라이버 개발 자가 작성 해 야 합 니 다.
1  struct fb_ops 
2  { 
3      struct module *owner; 
4       /*   /   */ 
5      int(*fb_open)(struct fb_info *info, int user); 
6      int(*fb_release)(struct fb_info *info, int user); 
7   
8      /*         /                   */ 
9      ssize_t(*fb_read)(struct file *file, char _  _user *buf, size_t
count, 
10        loff_t*ppos); 
11     ssize_t(*fb_write)(struct file *file, const char _  _user *buf,
size_t count, 
12        loff_t *ppos); 
13  
14     /*       ,        */ 
15         int(*fb_check_var)(struct  fb_var_screeninfo  *var,  struct
fb_info *info); 
16  
17    /*   info->var  video   */ 
18    int(*fb_set_par)(struct fb_info *info); 
19  
20    /*   color    */ 
21    int(*fb_setcolreg)(unsigned  regno,  unsigned  red,  unsigned  green, 
unsigned 
22        blue, unsigned transp, struct fb_info *info); 
23  
24     /*     color   ,      */ 
25     int(*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info); 
26  
27     /*     */ 
28     int(*fb_blank)(int blank, struct fb_info *info); 
29  
30     /* pan   */ 
31      int(*fb_pan_display)(struct  fb_var_screeninfo  *var,  struct 
fb_info *info); 
32  
33     /*      */ 
34        void(*fb_fillrect)(struct  fb_info  *info,  const  struct
fb_fillrect *rect); 
35     /*      */ 
36        void(*fb_copyarea)(struct  fb_info  *info,  const  struct
fb_copyarea *region); 
37     /*      */ 
38     void(*fb_imageblit)(struct  fb_info  *info,  const  struct  fb_image
*image); 
39  
40     /*      */ 
41     int(*fb_cursor)(struct  fb_info  *info,  struct  fb_cursor  *cursor);
42  
43     /*      */ 
44     void(*fb_rotate)(struct fb_info *info, int angle); 
45  
46     /*   blit   (  ) */ 
47     int(*fb_sync)(struct fb_info *info); 
48  
49     /* fb   ioctl (  ) */ 
50   int(*fb_ioctl)(struct  fb_info *info,  unsigned int  cmd, unsigned
long arg); 
51  
52   /*   32  compat ioctl (  ) */ 
53     int(*fb_compat_ioctl)(struct  fb_info  *info,  unsigned  cmd,
unsigned long arg); 
54  
55   /* fb   mmap */ 
56   int(*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);
57  
58   /*           */ 
59   void(*fb_save_state)(struct fb_info *info); 
60  
61   /*            */ 
62   void(*fb_restore_state)(struct fb_info *info); 
63 }; 


    LCD 구동 에서 중요 한 것 은 프레임 버퍼 (프레임 버퍼) 입 니 다. 
    FrameBuffer 의 원리
FrameBuffer 는 Linux 커 널 에 나타 난 드라이버 인터페이스 이다.이것 은 Linux 커 널 이 추상 적 으로 만들어 진 장치 로 사용자 상태 프로 세 스 가 직접 화면 을 쓸 수 있 도록 제공 합 니 다.Framebuffer 메커니즘 은 그래 픽 카드 의 기능 을 모방 하여 그래 픽 카드 하드웨어 구 조 를 추상 화하 고 Framebuffer 의 읽 기와 쓰 기 를 통 해 그래 픽 메모리 에 대해 직접 조작 할 수 있다.사용 자 는 Framebuffer 를 메모리 의 이미 지 를 표시 하 는 것 으로 보고 프로 세 스 주소 공간 에 투사 하면 읽 기와 쓰기 작업 을 직접 할 수 있 으 며 쓰기 작업 은 화면 에 즉시 반응 할 수 있 습 니 다.이런 조작 은 추상 적 이 고 통 일 된 것 이다.사용 자 는 물리 적 디 스 플레이 의 위치, 페이지 교환 체제 등 구체 적 인 세부 사항 에 관심 을 가 질 필요 가 없다. 이런 것들 은 모두 Framebuffer 장치 에 의 해 작 동 되 어 이 루어 진 것 이다.그러나 Framebuffer 자체 가 데 이 터 를 연산 하 는 능력 을 갖 추 지 못 하면 일시 적 으로 물 을 저장 하 는 연못 과 비교 할 수 밖 에 없다. CPU 는 연산 후의 결 과 를 이 연못 에 두 고 연못 은 다시 결 과 를 모니터 로 흐 르 게 한다. 중간 에 데 이 터 를 처리 하지 않 는 다. 응용 프로그램 에서 도 이 싱 크 대 내용 을 직접 읽 고 쓸 수 있 습 니 다. 이러한 메커니즘 에서 Framebuffer 는 진정한 그래 픽 카드 구동 지원 이 필요 하지만 모든 디 스 플레이 작업 은 CPU 가 수행 되 기 때문에 CPU 부담 이 큽 니 다.
    framebuffer 의 장치 파일 은 일반적으로/dev/fb0,/dev/fb1 등 입 니 다.
명령:\# dd if =/dev/zero of =/dev/fb 로 화면 을 비 울 수 있 습 니 다.
디 스 플레이 모드 가 1024 x768 - 8 비트 색 이면 명령: $dd if =/dev/zero of =/dev/fb0 bs = 1024 count = 768 로 화면 을 비 웁 니 다.
명령:\# dd if =/dev/fb of = fbfile 로 fb 의 내용 을 저장 할 수 있 습 니 다.
화면 을 다시 쓸 수 있 습 니 다:\# dd if = fbfile of =/dev/fb;
Framebuffer 를 사용 할 때 리 눅 스 는 그래 픽 모드 에 그래 픽 카드 를 두 었 습 니 다.
응용 프로그램 에서 일반적으로 FrameBuffer 장 치 를 프로 세 스 주소 공간 에 비 추 는 방식 으로 사용 합 니 다. 예 를 들 어 아래 프로그램 은/dev/fb0 장 치 를 열 고 mmap 시스템 호출 을 통 해 주소 맵 을 한 다음 에 memset 으로 화면 을 비 웁 니 다 (여기 서 디 스 플레이 모드 는 1024 x768 - 8 비트 색 모드, 선형 메모리 모드 라 고 가정 합 니 다).
  int fb;
  unsigned char* fb_mem;
  fb = open ("/dev/fb0", O_RDWR);
  fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);
  memset (fb_mem, 0, 1024*768);//이 명령 은 루트 에서 만 실행 할 수 있 을 것 입 니 다.
FrameBuffer 장 치 는 몇 가지 ioctl 명령 도 제공 합 니 다. 이 명령 을 통 해 디 스 플레이 장치 의 고정 정보 (예 를 들 어 메모리 크기 표시), 디 스 플레이 모델 과 관련 된 가 변 정보 (예 를 들 어 해상도, 픽 셀 구조, 스 캔 라인 마다 바이트 너비), 가짜 컬러 모드 에서 의 팔레트 정보 등 을 얻 을 수 있 습 니 다.
--------------------------------------------------------------------------------------------------------------------------------------------------------
    다음은 framebuff 가 Linux 커 널 에서 의 실현 체 제 를 분석 하기 시작 합 니 다.
퇴근 했 습 니 다. 먼저 간략하게 쓰 세 요. LCD 드라이브 에 세 개의 파일 이 있 습 니 다.
1、alps\xx\platform\mt\kernel\drivers\video\lcd_drv.c
2、alps\xx\source\kernel\drivers\video\xxfb.c
3、alps\kernel\driver\video\fbmem.c
fbmem. c 파일 은 원본 커 널 의 파일 입 니 다. framebuff 의 핵심 파일 로 framebuff 구동 의 등록, 마 운 트 해제 등 함 수 를 실현 하고 장치 파일 을 등록 하 였 습 니 다.
xx fb. c 는 xx 플랫폼 이 고 LCD 의 구체 적 인 framebuff 구동 입 니 다.fbmem. c 의 framebuff 의 등록 과 마 운 트 해제 함 수 를 호출 하여 시스템 에 xx 의 fb 드라이브 를 등록 합 니 다.
lcd_drv. c 에서 구체 적 인 하드웨어 설정 작업 을 실 현 했 습 니 다.오케이.배 고 파 ~ ~ 돌아 가 ~ ~

좋은 웹페이지 즐겨찾기