컴퓨터공부/Linux & Unix

Linux device driver에서의 file 입출력 방법(모듈에서 파일 접근)

achivenKakao 2006. 8. 21. 03:49

모회사의 Chipset에 대한 디바이스 드라이버를 작성하는 과정에서..

느닷없이 binanry 이미지를 초기에 읽어와서 이를 chipset의 내부 메모리에 써 넣어야 하는 부분이 있었습니다.

 

처음에는 대략 User Sapce 단에서 어찌어찌 처리하려고 했는데..

이 binary 가 사용하려는 Chipset의 초기 startup 코드이더군요..

결국 가장 먼저 읽어들여서 chipset을 reset 한 직후에 반영을 시켜야 하는데..

 

사실 디바이스 드라이버단에서

이렇게 펌웨어를 Chipset에 다운로드 시키는 것을 그다지 좋아하지 않습니다. ^^

일반적인 좋은 방법도 아니고.. 이러다보면 펌웨어 업그레이때마다 그다지 편하지도 않구요..

 

그래도 방법이 없어서 몇군데 뒤져보니...

 

linuxkernel.net 에서 flyduck 이호님이 적은 글이 있더군요..

Advanced Linux module programming 이라는 pdf 파일입니다.

 

거기에 보니 커널의 httpd 데몬에서 디바이스 드라이버에서 파일 입출력을 구현한 루틴이 있다고 해서요..

 

참조한 주소는 linuxkernel.net 입니다.

 



 

실제로 주소는요..

 

문서는 http://linuxkernel.net/personal/doc.php 에 있는 "Advanced Module Programming"을 보시고,
소스는
http://linuxkernel.net/moduleprog/klib/ 에 있는 코드를 보세요.

 

 

이렇게 되어있구요.. 아래는 실제로 제가 작성해본 코드입니다.

 

// kingseft 20051224
 mm_segment_t  oldfs;
 struct file *filp;
 unsigned long * buf ;
 int readlen, writelen;

 

// kingseft 20051224  
 // file open processing in device driver
 // specify firmware size in bytes
 
 buf = (unsigned long *)vmalloc(1<<18);  // 256KB
 
 if(( filp = filp_open("./firm.bin", O_RDONLY, 0)) != NULL){
      oldfs = get_fs();
      set_fs(KERNEL_DS);
      readlen = filp->f_op->read(filp, buf , 241144 , &filp->f_pos);
      set_fs(KERNEL_DS);
      fput(filp);
  printk("\nreadlen = %d\n", readlen);
 }
 
 
 // file writing processing in device driver
 if ((filp = filp_open("./firm.bin.copy", O_CREAT| O_WRONLY| O_TRUNC| S_IRUGO| S_IWUSR, 0)) != NULL) {
      oldfs = get_fs();
      set_fs(KERNEL_DS);
      writelen = filp->f_op->write(filp, buf, readlen, &filp->f_pos);
      set_fs(KERNEL_DS);
      fput(filp);
      printk("\nwritelen = %d\n", writelen);
 }