기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

Bus : a Channel between the processor and the devices

Linux Device Model 에서는 모든 디바이스는 내부든 외부든 버스로 연결 되어있다.

        --> Platform bus : Virtual Bus

        : The platform devices are the devices that are directly connected to the CPU, without any kind of bus.

        : The platform devices cannot be detected dynamically, they are statically defined.

        : The matching between a device and the driver is simply done using the name.

        : The platform device does not have a hotplug event.


대충 여기저기서 긁어 모아서 정리해 보니 저렇게 되더군요, 즉 Embedded System에서는

Processor 내부의 Core와 Device간의 버스를 가상으로 만들어 놓은, 논리 버스 및 디바이스 드라이버라고 결론이 나는데요.


질문드리고 싶은게 몇게 있습니다.


1. Embedded system을 제외한, PC-compatible System(즉, South, North Bridge가 사용되는)에서도 Platform Device Driver Model이 사용되는지요? 있다면 어떤경우인가요?


2. Platform Device Driver는 동적으로 할당이 되지 않는 것 같습니다. 소스를 디벼본 결과 board-xxx.c 파일에서 초기 등록해주는 것 같습니다. 등록을 해주면 platform driver의 Probe함수가 작동하겠죠. 

그렇다면 Platform device 및 Driver 는 Board-xxx.c 의 보드파일을 제외하고는 별도로 initialization 혹은 등록되는 부분은 없는건가요? 즉, 부팅 시에만 등록이 되도록 되어 있는 것인가요?


3. Platform device driver 의 역할입니다. driver의 포인터 함수 매칭을 보니 probe, suspend, 등 약 5가지 함수만이 매칭 되어 있던데요. 기능상으로 Platform Deivce Driver는 어느경우에 사용이 되는건가요? 

단순히, Kobject에 구색 맞추기 및 Power-Management 에 그 목적이 있는건가요?

platform device 등록과 동시에, i2c 및 기타 다른 디바이스로 등록되는 경우를 많이 보아서 이렇게 질문드립니다.



읽어주셔서 감사합니다.


답변 달아주시면 더 감사하겠습니다.


funmoney

2011.07.05 22:11:39
*.169.251.167

어려운 내용이네요, 제생각을 적어보았습니다.  잘못된 생각일수도 있으니 참고만 하심이 좋겠네요.

 

Q : PC-compatible System(즉, South, North Bridge가 사용되는)에서도 Platform Device Driver Model이 사용되는지요?
A : 어차피 동일 한 kernel 을 이용함으로 사용될 수 있다고 생각합니다.

    문제는
    x86 계열의 칩들은 CPU 에서 태동하였으므로, linux 코드도 여기에 맞추어 발전하였습니다. 반면에
    SoC 형태의 Processor 인 ARM/POWERPC등의 계열의 Processor 는 CPU와 주변장치가 1개의 package 안에 대부분 들어가는
    형태에서 태동하여 발전하였고, linux 코드도 여기에 맞추어 발전하였습니다.
   
    이로 부터 유추해 보면
    1개의 SoC chip 안에 있는 모든 HW는 Kernel 의 부팅과정에서 초기화를 마친다는 Platfrom device driver model
    의 주요목적에 x86계열은 태생부터가 궁합이 맞지 않는 형태로 발전했을 것입니다.
    ( 궁합이 맞지 않을 뿐이지 불가능 하지는 않다고 생각됩니다. )
   
    즉, 적용할 수 있느냐 없는냐의 문제를 놓고 고민해 볼때 관건은 x86기반의 Board 가 어떻게 설계되어 있느냐에 따라
    결정될 듯 합니다.
    
    x86 계열의 CPU 들은 open structure 구조를 채택하고 있어 거의 모든 device 들을 PCI 나 USB 등의 국제 표준 bus 에
    연결하는 형태로 디자인 되어 있습니다. 즉, I2C / I2S / SPI / local periphral bus / UART / MII 등의 다양한 버스를
    CPU 내부에 일반적으로 가지고 있지 않고 이런 버스들이 사용되는 device 들은 PCI 나 USB 등 또는 그들만의 bus방식등의 bridge device 를 통하여
    연결되는 구조를 전제로 하고 있습니다.
    따라서, 추측컨데 x86기반의 board 들은 대부분 USB/PCI 등 표준 bus 를 통하여 I/O device 들을 제어하는 구조로
    설계되어 있을 것입니다. 이 경우 굳이 platform device 를 사용할 이유가 없습니다. PCI / USB device & driver 로
    처리하면 됩니다.
   
    그런데, 만약 x86계열의 core 를 가지고 있으나 local peripheral bus 에 I/O-device , I2C / MII / SPI 등으로 제어되는
    device 가 연결된 board 라면 ARM 계열 처럼 Platfrom device & driver model 을 사용해도 좋으리라 생각합니다.
    단지, 문제는 speed 라고 봅니다. x86 은 이미 태생부터 고속 clock 인데 저속의 device들을 local host bus 에 연결해 놓을
    이유가 없어 보입니다. 따라서 그런 보드를 만들바에는 ARM 계열이나 PowerPC 계열의 Processor 를 사용하지 않을 까 싶습니다.
    말이 길어졌는데요,
   
    " 요지는 platform device & driver model 을 x86 계열의 linux 에서도
      사용할 수 있다고 생각합니다. "
     
Q : Platform device 및 Driver 는 Board-xxx.c 의 보드파일을 제외하고는 별도로 initialization 혹은 등록되는 부분은
    없는건가요? 즉, 부팅 시에만 등록이 되도록 되어 있는 것인가요?
A : 해보지는 않았으나 아래처럼 테스트 해보면 알 수 있을 듯 합니다.
   
    insmod / rmmod 처럼 driver 를 추가 제거하는 방법은 legacy(전통적인) 방법이빈다. platform device & driver model에서는
    이것이 가능하도록 하는 API 를 제공하고 있으므로 이것을 이용하여 module driver 를 만들면 될 듯 합니다.
    이경우 module_init() 함수에서 다음과 같은 일을 하도록 하여 테스트 해보면 될 듯 합니다.
    
       0) platform device driver 등록 ("platform_driver_register()")

       1) platform device 를 생성 ("platform_device_alloc()" ")
       2) platfrom device 의 resource 또는 platform data를 등록 (필요할 경우)
       3) platform device 를 등록 ("platform_device_add()") 

       

 --> 이때 probe() 함수가 호출되는지 확인 .


        platform device / platform driver 는 서로 name 이 같을 경우에 mapping 이 된다고 생각하면 되고

        add devce 에 의하여 kernel 은 device name 과 같은 name 을 가진 driver 를 찾고 찾아진 함수의 ops 구조체에서

        probe() 함수를 call 하게 되는데 이런 동작을 위의 순서대로 하면 모듈로도 가능할 것으로 보여서 적어 보았습니다.

 


Q : Platform Device Driver는 어느경우에 사용이 되는건가요?
A : 경험에 기반하여 설명을 드리면

    0. PCI / USB / STORAGE / character 형 device 들을 제외하고
    1. platform device 는 주로 kernel 에 대한 service 를 제공하는 device 인 경우 ( ex, serial port / ethernet port / mtd device )
    2. SoC 안에 controller 가 있는 bus 관련 client / host device 인 경우 ( i2c / i2s / spi )
   
    에 사용하는 것 같습니다.
   
    ( 경우에 따라서는 probe() 함수만 사용되는 경우도 있습니다. )

List of Articles
번호 제목 글쓴이 날짜 조회 수
4728 마스터 볼륨이란? [3] 꺼북이 2011-07-06 1267
4727 uboot에서 yaffs랑 MoviNAND에 동시에 write 하려면? [2] 텡구 2011-07-06 1012
4726 안드로이드 recovery system utility font 변경 질문드려요 이시우 2011-07-06 685
4725 블루투스 with HCI 새희망 2011-07-05 706
4724 예전에 등록되었던 자료를 찾고 있습니다. [2] jameskody 2011-07-05 488
4723 로비/인터폰 구현시 적절한 레퍼런스류 및 구조 조언 부탁합니다 [2] 마은빈 2011-07-05 1549
4722 [질문 수정했음] RTC 드라이버 포팅 관련 .... file [5] 장석원 2011-07-05 1525
4721 u-boot와 kernel MACH_TYPE에 대해서 질문 드립니다. [8] 데카 2011-07-05 1341
4720 android 부팅메시지 관련 질문드립니다. [1] 죠니주니 2011-07-05 529
4719 i2c 연결에 관해 질문드립니다. [2] 한승우 2011-07-05 513
» Platform Bus/Device/Driver에 대해서 간략히 정리해 보았습니다. [1] 코와붕과 2011-07-05 2026
4717 커널 패닉시 콘솔에 출력 되는 패닉 메시지에 관한 질문 [1] k0cool 2011-07-04 579
4716 u-boot용량이 늘어날때 [1] 다크썩흘 2011-07-04 501
4715 Linux kernel L2 캐쉬 policy [2] 양파링 2011-07-02 640
4714 상용단말 디바이스 퍼미션 문제 [1] kwak 2011-07-02 489
4713 진저브레드에서 마우스 커서 문제 [1] 가족사랑 2011-07-01 1037
4712 리눅스 Boot Sequence 관련해서 Setup_arch()와 rest_init() 질문!... [2] 코와붕과 2011-07-01 868
4711 안드로이드 루트이미지에서 기본 화면 방향 설정 [2] 김태영 2011-07-01 1031
4710 S3C64X0 예전 계시물(자료)는 어떻게 구하죠? jameskody 2011-07-01 521
4709 커널패닉을 LCD에 출력하기 질문.. k0cool 2011-07-01 469

사용자 로그인