포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.

1.container_of // ==> 이녀석은 전체 문서에서 appendix로 보내야 하겠다.
 
- kernel.h
/**
 * container_of - cast a member of a structure out to the containing structure
 *
 * @ptr:        the pointer to the member.
 * @type:       the type of the container struct this is embedded in.
 * @member:     the name of the member within the struct.
 *
 */
#define container_of(ptr, type, member) ({                     
        const typeof( ((type *)0)->member ) *__mptr = (ptr);   
        (type *)( (char *)__mptr - offsetof(type,member) );})

ptr : 멤버의 포인터
type: 이 멤버를 포함하고 있는 컨테이너 스트럭쳐의 타입
member: type structure에 안에서 존재하는 멤버의 이름

 

ex> s3c2410 framebuffer의 경우

 

struct s3c2410fb_info {
 struct fb_info  fb;
 struct device  *dev;
 struct clk  *clk;

 struct s3c2410fb_mach_info *mach_info;

 /* raw memory addresses */
 dma_addr_t  map_dma; /* physical */
 u_char *  map_cpu; /* virtual */
 u_int   map_size;

 struct s3c2410fb_hw regs;

 /* addresses of pieces placed in raw buffer */
 u_char *  screen_cpu; /* virtual address of buffer */
 dma_addr_t  screen_dma; /* physical address of buffer */
 unsigned int  palette_ready;

 /* keep these registers in case we need to re-write palette */
 u32   palette_buffer[256];
 u32   pseudo_pal[16];
};

 

라는 s3c2410 고유의 스트럭쳐가 있을 경우  framebuffer main frame에서는 실제로

 

struct fb_info  fb;

 

만을 사용한다. 하지만 드라이버에서는 s3c2410 고유의 스트럭쳐를 필요로 한다.

해서 fb만을 가지고 s3c2410fb를 가져와야 한다.(실제로는 fb의 ptr을 가지고 해야한다.


왜냐하면 등록할때 s3c2410fb의 fb의 ptr을 가지고 등록하기 때문이다.)

해서 다음과 같은 inline함수를 만들어서 사용한다.

 

static inline struct s3c2410fb_info *fb_to_s3cfb(struct fb_info *info)
{
 return container_of(info, struct s3c2410fb_info, fb);
}

 

입력은 당연히 fb_info 형 ptr이 되고


출력은 이 녀석을 품고 있는 s3c2410fb_info structure의 ptr을 리턴해 줘야 한다.

맨 마지막 인자인 fb는 s3c2410fb_info에서의 fb_info라는 형을 가지는 녀석의 이름이
fb라고 얘기하는 것이다.

 

더 자세한 실제 코드는 aesop 2440 2.6.13 커널이나, 공식
리눅스 커널 2.6.13의 drivers/video/s3c2410_fb.c를 보시면 될겁니다.

 

"사람은 자기가 보고 싶은 현실만 볼 뿐이다." - Gaius Julius Caesar
엮인글 :
http://www.aesop.or.kr/index.php?mid=Board_Documents_Linux_Kernel&document_srl=35388&act=trackback&key=1ef
List of Articles
번호 제목 글쓴이 날짜 조회 수

devicetree usage 번역판 file [1]

MTD/JFFS2 howto file

DeviceTree for ARM 관련 간단 글. [3]

드라이버의 다이내믹 설정? [1]

Linux kernel Documentation DocBook 만들기 [1]

USB Gadget RNDIS ethernet howto - for C110/V210 file [5]

kernel architecture number(mach-types) 직접 커널에 입력하기

crosstool-ng 관련 site

리눅스 커널에서의 container_of macro 설명

리눅스 커널 dump_stack() 사용방법입니다.

  • pinebud
  • 2011-05-15
  • 조회 수 12105

ubuntu 에서 kubuntu ppa backports repository 지정방법 [1]

이광우님 android v4l2 camera porting자료 file [6]

초보자를 위한 부트로더/커널/안드로이드 빌드 환경 설정 및 실습 [10]

sysvinit howto입니다. file

busybox howto입니다 file

SMP kernel에서 interrut를 각 CPU별로 공유 하는 기사 입니다.

  • 시안
  • 2010-10-21
  • 조회 수 14222

cramfs 사용하기 file [2]

uboot에서 ubifs 이미지 nand에 쓰는 방법 [4]

android-x86/Donut 을 viliv S5에 포팅해본본 내용입니다. [3]

  • pinebud
  • 2010-06-25
  • 조회 수 18591

Android WiFi 포팅하기 file [6]

사용자 로그인