EzDoum

찾기
처음으로 | 찾기 | 아카이브 | 글 올리기 | 링크 | 자료실 | 통계 | 연락처 | 자유게시판
이지도움 특집
전체보기
네트워크
TI OMAP35x
TI DaVinci
Analog Blackfin
RobotWar2005
임베디드!
캐쉬의 모든것
메모리 할당 알고리즘
CPU 파이프라이닝
자료구조(Tree)
금융

Login
이름

암호

기억하기


사용자 등록

현재 접속중인 등록 사용자는 0명, 익명 사용자는 2명 입니다.
전체 등록 사용자: 751명

마지막 답장
·libcurl + fuse 조합으로 되는게 많네. (1)
·Linux Ftrace에 관해 (3)
·Android MTP ( Media Transfer Protocol ) (1)
·Lighttpd에 인증을 digest 사용시 IE 오동작 문제? (1)
·Dtrace에 관해 (1)

최근글
·OpenSSL and multi-threads (0)
·ARM 환경에서 OpenCL 사용 (0)
·IoT용 WIFI 모듈 비교 ( MCU ) 클래스 (0)
·Glances - 리눅스 여러 가지 항목을 한 화면에서 모니터링 (0)
·plugin 방식의 로그 분석기 (0)

뜨거운 감자
·나는 인터렉티브한 환경에서 역어셈블 한다. (12)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)
·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)
·DHTML Editing Control (7)

가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
·멀티쓰레드(Pthread) 프로그래밍
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·Sorting Algorithm Animation (2)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

리눅스 커널에서 NAND Driver 작성할 때 주요사항
글쓴이: EzDoum 글쓴날: 2008년 01월 31일 오후 06:01




MTD_NAND_Driver_Programming_Interface.pdf 내용을 정리한 것임

# Partition defines
nand 파티션 테이블을 정의, 커널 부팅할 때 파라메터로도 넘길 수 있음

CONFIG_MTD_PARTITIONS

  1. #define NUM_PARTITIONS 2
  2. static struct mtd_partition partition_info[] = {
  3.         { .name = "Flash partition 1",
  4.           .offset0,
  5.           .size =    8 * 1024 * 1024 },
  6.         { .name = "Flash partition 2",
  7.           .offset =  MTDPART_OFS_NEXT,
  8.           .size =    MTDPART_SIZ_FULL },
  9. };


# Hardware control function
nand를 제어하는 하드웨어 시그널을 다루는 방법
프로세서가 nand 컨트롤러 유무에 따라 달라진다.


<GPIO based example>

  1. static void board_hwcontrol(struct mtd_info *mtd, int cmd)
  2. {
  3.         switch(cmd){
  4.                 case NAND_CTL_SETCLE: /* Set CLE pin high */ break;
  5.                 case NAND_CTL_CLRCLE: /* Set CLE pin low */ break;
  6.                 case NAND_CTL_SETALE: /* Set ALE pin high */ break;
  7.                 case NAND_CTL_CLRALE: /* Set ALE pin low */ break;
  8.                 case NAND_CTL_SETNCE: /* Set nCE pin low */ break;
  9.                 case NAND_CTL_CLRNCE: /* Set nCE pin high */ break;
  10.         }
  11. }


<Address lines based example>

  1. static void board_hwcontrol(struct mtd_info *mtd, int cmd)
  2. {
  3.         struct nand_chip *this = (struct nand_chip *) mtd->priv;
  4.         switch(cmd){
  5.                 case NAND_CTL_SETCLE: this->IO_ADDR_W |= CLE_ADRR_BIT;  break;
  6.                 case NAND_CTL_CLRCLE: this->IO_ADDR_W &= ~CLE_ADRR_BIT; break;
  7.                 case NAND_CTL_SETALE: this->IO_ADDR_W |= ALE_ADRR_BIT;  break;
  8.                 case NAND_CTL_CLRALE: this->IO_ADDR_W &= ~ALE_ADRR_BIT; break;
  9.         }
  10. }


# Device ready function
nand에 커맨드가 내려지고 나서 데이터가 나오기까지 기다려야 한다.

1) 프로세서에서 이 신호를 바로 받을 수 있으면 좋고,
2) nand 쪽으로 status 커맨드를 내려서 값을 확인하는 폴링
3) R/B pin과 프로세서 gpio 인풋을 연결하고 이 핀의 상태를 폴링
4) 넉넉하게 delay를 주는 방법


# Init/exit function


  1. int __init board_init (void)
  2. {
  3.         struct nand_chip *this;
  4.         int err = 0;
  5.  
  6.         /* Allocate memory for MTD device structure and private data */
  7.         board_mtd = kzalloc(sizeof(struct mtd_info) + sizeof(struct nand_chip), GFP_KERNEL);
  8.         if (!board_mtd) {
  9.                 printk ("Unable to allocate NAND MTD device structure.\n");
  10.                 err = -ENOMEM;
  11.                 goto out;
  12.         }
  13.  
  14.         /* map physical address */
  15.         baseaddr = (unsigned long)ioremap(CHIP_PHYSICAL_ADDRESS, 1024);
  16.         if(!baseaddr){
  17.                 printk("Ioremap to access NAND chip failed\n");
  18.                 err = -EIO;
  19.                 goto out_mtd;
  20.         }
  21.  
  22.         /* Get pointer to private data */
  23.         this = (struct nand_chip *) ();
  24.         /* Link the private data with the MTD structure */
  25.         board_mtd->priv = this;
  26.  
  27.         /* Set address of NAND IO lines */
  28.         this->IO_ADDR_R = baseaddr;
  29.         this->IO_ADDR_W = baseaddr;
  30.         /* Reference hardware control function */
  31.         this->hwcontrol = board_hwcontrol;
  32.         /* Set command delay time, see datasheet for correct value */
  33.         this->chip_delay = CHIP_DEPENDEND_COMMAND_DELAY;
  34.         /* Assign the device ready function, if available */
  35.         this->dev_ready = board_dev_ready;
  36.         this->eccmode = NAND_ECC_SOFT;
  37.  
  38.         /* Scan to find existence of the device */
  39.         if (nand_scan (board_mtd, 1)) {
  40.                 err = -ENXIO;
  41.                 goto out_ior;
  42.         }
  43.        
  44.         add_mtd_partitions(board_mtd, partition_info, NUM_PARTITIONS);
  45.         goto out;
  46.  
  47. out_ior:
  48.         iounmap((void *)baseaddr);
  49. out_mtd:
  50.         kfree (board_mtd);
  51. out:
  52.         return err;
  53. }
  54. module_init(board_init);
  55.  
  56.  
  57. #ifdef MODULE
  58. static void __exit board_cleanup (void)
  59. {
  60.         /* Release resources, unregister device */
  61.         nand_release (board_mtd);
  62.  
  63.         /* unmap physical address */
  64.         iounmap((void *)baseaddr);
  65.        
  66.         /* Free the MTD device structure */
  67.         kfree (board_mtd);
  68. }
  69. module_exit(board_cleanup);
  70. #endif

  • 첨부 파일: MTD_NAND_Driver_Programming_Interface.pdf MTD_NAND_Driver_Programming_Interface.pdf (1 MiB(1,256,376 Bytes))

    [분류: 리눅스 커널 인쇄용 페이지 본문 email로 보내기 ]

  • <  u-boot 환경 설정 스크립트 | NAND Flash 제어  >

    답장 쓰기
    글을 올리시려면 로그인 (사용자 등록) 하셔야 합니다.

    검색
    Google

    분류
    ·공지 (6)
    ·인터넷 (87)
    ·하드웨어 (260)
    ·C/C++ (65)
    ·어셈블리 (7)
    ·리눅스 (136)
    ·리눅스 커널 (67)
    ·윈도우즈 (25)
    ·데이터베이스 (20)
    ·보안 (16)
    ·.NET (25)
    ·그래픽 (13)
    ·책소개 (42)
    ·호기심 천국 (80)
    ·잡담 (111)
    ·사랑 (3)

    전체 본문수: 963
    전체 답장수: 525


    분류 : 리눅스 커널
    최근글
    최근글
    가장 많이 읽은 글
    ·리눅스 커널 공부하기 (2)
    뜨거운 감자
    ·SunWorld Online (4)

    EzDoum투표
    이지도움 어때요?
    이게 뭐야. 다시 안올란다. --;
    아이 좋아라~ +_+;
    관심없다.
    먼가는 있는거 같은데 뭐하는 곳이지?
    기타 (자유게시판에 글로 남겨 주세요)
    [ 결과 | 투표 ]

    랜덤 링크
    http://kldp.net


     Home ^ BACK TO TOP ^ EzDoum - 도움이 필요하세요~??
     Powered by KorWeblog 1.5.8 Copyleft © 2001 EzDoum, 관리자: EzDoum