Linux 에서 LCD 구동 구조 분석
구동 을 분석 하기 전에 먼저 몇 개의 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 에서 구체 적 인 하드웨어 설정 작업 을 실 현 했 습 니 다.오케이.배 고 파 ~ ~ 돌아 가 ~ ~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.