도와주세요!!
글 수 15,339
2009.02.05 10:01:17 (*.241.151.50)
13879
2009.02.09 07:43:34 (*.241.151.50)
아. 답변 감사합니다.
오재경님께서 작성하신 PCI 관련 문서를 보았습니다.
예.. 제가 읽어본 문서는 그렇게 쓰여있는데요.. ^^
작성해 주신 sample driver에서 pci resource 를 가져오려면, platform에 등록되어있어야 하지 않습니까?
그 부분은 어떻게 등록하셨는지 궁금합니다.
그리고..
PCI관련해서 자료 공유해 주시면 감사하겠습니다. ^^
부탁드립니다.
오재경님께서 작성하신 PCI 관련 문서를 보았습니다.
예.. 제가 읽어본 문서는 그렇게 쓰여있는데요.. ^^
작성해 주신 sample driver에서 pci resource 를 가져오려면, platform에 등록되어있어야 하지 않습니까?
그 부분은 어떻게 등록하셨는지 궁금합니다.
그리고..
PCI관련해서 자료 공유해 주시면 감사하겠습니다. ^^
부탁드립니다.
2009.02.09 10:48:33 (*.138.143.83)
PCI 관련 자료는 pdf 파일등으로는 없습니다.
그저 칩 데이타쉬트상의 문서정도구요..
책으로는 동명메카트로닉스에서 나온 "PCI 버스해설과 인터페이스카드설계" 라는 책 정도입니다.
pci 리소스는 등록하는것이 아니고 커널이 리소스를 할당해 놓은것을 불러다 써야 합니다.
pci_register_device() 함수를 사용하여 드라이버 구조체를 등록하고
콜백된 probe() 에서 내가 사용할 주소를 얻는 방식입니다.
pci_register_device() 함수를 커널 소스에서 찾아 구현 소스등을 보시면 그리 어렵지 않을 겁니다.
현재 커널 2.6 부터 일반적인 드라이버들은 platform 에 리소스가 등록된 상태에서 진행되고 있는데
사실 이것은 이전부터 사용되고 있는 PCI 버스 형태의 관리와 거의 비슷합니다.
PCI 는 이전 부터 platform 방식(?)처럼 관리되고 있었으니까요 ^^
리소스(주소,인터럽트)를 획득한 이후에는 기존 디바이스 드라이버와 동일합니다.
그저 칩 데이타쉬트상의 문서정도구요..
책으로는 동명메카트로닉스에서 나온 "PCI 버스해설과 인터페이스카드설계" 라는 책 정도입니다.
pci 리소스는 등록하는것이 아니고 커널이 리소스를 할당해 놓은것을 불러다 써야 합니다.
pci_register_device() 함수를 사용하여 드라이버 구조체를 등록하고
콜백된 probe() 에서 내가 사용할 주소를 얻는 방식입니다.
pci_register_device() 함수를 커널 소스에서 찾아 구현 소스등을 보시면 그리 어렵지 않을 겁니다.
현재 커널 2.6 부터 일반적인 드라이버들은 platform 에 리소스가 등록된 상태에서 진행되고 있는데
사실 이것은 이전부터 사용되고 있는 PCI 버스 형태의 관리와 거의 비슷합니다.
PCI 는 이전 부터 platform 방식(?)처럼 관리되고 있었으니까요 ^^
리소스(주소,인터럽트)를 획득한 이후에는 기존 디바이스 드라이버와 동일합니다.
2009.02.09 11:56:28 (*.241.151.50)
작성하신 sample pci driver를 보고 있습니다.
static int __devinit spci_probe (struct pci_dev *pdev, const struct pci_device_id *ent);
함수에서 pci_dev *pdev 변수를 등록해 주어야, probe 함수에서 input 인자로 받아서 사용할수 있지 않습니까?
보통, arch/arm/mach-xxx/xxx.c 의 init 함수들에서, struct platform_device로 등록해 주어야 하지 않습니까?
그래야 추후, 리소스를 획득해서 사용할수 있지 않나요?
그리고,
pci register에 대한 설정을 진행해야 하지 않습니까?
2009.02.10 07:58:44 (*.138.143.83)
예전에 제가 공개세미나에서 강의한 소스를 보고 계신건가요?
현재 저는 그 자료를 찾을 수 없어서 ㅡ.ㅡ (어딘가 있을것 같은데...쩝)
PCI 의 리소스는 커널이 알아서(?) 할당해 줍니다.
pci_register_device() 함수를 호출하여 콜백된 probe() 함수의 pdev 를 통해 접근할 수 있습니다.
PCI 칩들은 자신이 사용하는 메모리의 크기를 칩안에 내장하고 있으며 커널은 config 엑세스를 통해 PCI 칩의 베이스 주소를
PCI 칩에 써 넣는 동작을 합니다. 이후 PCI 칩은 커널이 넣어준 베이스주소에 반응하게 되는 것이지요
중요한건 사용자가 주소를 정하는것이 아니라는 겁니다. 커널이 PCI 규약에 따라 주소를 할당합니다.
인터럽트는 슬롯의 번호로써 역산하여 할당받습니다. 규칙을 따르지 않았다면 arch 쪽의 mach-xxx 에서
PCI 슬롯번호에 따른 irq 리턴함수를 수정하셔야 합니다.
현재 저는 그 자료를 찾을 수 없어서 ㅡ.ㅡ (어딘가 있을것 같은데...쩝)
PCI 의 리소스는 커널이 알아서(?) 할당해 줍니다.
pci_register_device() 함수를 호출하여 콜백된 probe() 함수의 pdev 를 통해 접근할 수 있습니다.
PCI 칩들은 자신이 사용하는 메모리의 크기를 칩안에 내장하고 있으며 커널은 config 엑세스를 통해 PCI 칩의 베이스 주소를
PCI 칩에 써 넣는 동작을 합니다. 이후 PCI 칩은 커널이 넣어준 베이스주소에 반응하게 되는 것이지요
중요한건 사용자가 주소를 정하는것이 아니라는 겁니다. 커널이 PCI 규약에 따라 주소를 할당합니다.
인터럽트는 슬롯의 번호로써 역산하여 할당받습니다. 규칙을 따르지 않았다면 arch 쪽의 mach-xxx 에서
PCI 슬롯번호에 따른 irq 리턴함수를 수정하셔야 합니다.
하지만 PCIe 버스는 PCI 버스와 물리적인 구성만 달리하는것으로 알고 있습니다.
PCIe 는 하나의 PCI 슬롯에서 function 으로 존재하는 것이구요
포팅자체는 그냥 PCI 버스인 것으로 알고 있습니다만 ...
제 의견이 틀리다면 지적해 주시기 바랍니다.