2016-02-08 15 views
5

Tôi đang viết trình điều khiển PCIe cho Linux, hiện không có DMA và cần biết cách đọc và ghi vào thiết bị PCIe sau khi được kích hoạt từ không gian người dùng.Trình điều khiển PCIe - Cách không gian người dùng truy cập vào nó?

Trong tài xế tôi làm những điều cơ bản trong thăm dò():

pci_enable_device(); 
pci_request_regions(); 
pci_iomap(); 

Nhưng sau đó làm thế nào để truy cập vào bộ nhớ này từ không gian người sử dụng để đọc và viết? Tôi có thêm hoạt động tập tin vào trình điều khiển PCIe của mình không? Bộ nhớ từ pci_iomap có hiển thị một số nơi mà mã vùng người dùng có thể gọi:

open('mapped memory location'); 
mmap(...); 

Nếu vậy thì vị trí là gì?

Lưu ý: thiết bị PCIe sẽ không cắm vào bất kỳ hệ thống con Linux như âm thanh, Ethernet vv

+0

Không chắc đó có phải là cách được khuyến nghị để thực hiện mọi thứ hay không, nhưng trình điều khiển hạt nhân khác phơi bày các thiết bị ảo như '/ dev/vboxnetctl', mà tôi cho rằng bạn có thể đưa ra lệnh. Tôi không chắc chắn rằng hạt nhân Linux sẽ cho phép bất kỳ chương trình không gian người dùng để đọc/ghi vào một thiết bị PCIe willy-nilly, có vẻ như nó có thể nguy hiểm. –

+0

Tôi cũng đang xem xét điều đó. Có điều gì tôi cần làm để thiết bị của tôi hiển thị ở đó không? Ví dụ: tôi thực hiện cuộc gọi API nào trong trình điều khiển của mình? – user2205930

+0

Có lẽ hãy xem mã nguồn trình điều khiển VirtualBox để biết các ý tưởng. –

Trả lời

0

Bạn có thể đăng ký các thiết bị sử dụng các chức năng như register_chrdevdevice_create. Hãy xem xét các kernel source for /dev/null and /dev/mem:

static int __init chr_dev_init(void) 
{ 
    int minor; 

    if (register_chrdev(MEM_MAJOR, "mem", &memory_fops)) 
     printk("unable to get major %d for memory devs\n", MEM_MAJOR); 

    mem_class = class_create(THIS_MODULE, "mem"); 
    if (IS_ERR(mem_class)) 
     return PTR_ERR(mem_class); 

    mem_class->devnode = mem_devnode; 
    for (minor = 1; minor < ARRAY_SIZE(devlist); minor++) { 
     if (!devlist[minor].name) 
      continue; 

     /* 
     * Create /dev/port? 
     */ 
     if ((minor == DEVPORT_MINOR) && !arch_has_dev_port()) 
      continue; 

     device_create(mem_class, NULL, MKDEV(MEM_MAJOR, minor), 
        NULL, devlist[minor].name); 
    } 

    return tty_init(); 
} 

fs_initcall(chr_dev_init); 
+0

Có, cuối cùng tôi đã tạo một trình điều khiển thiết bị nhân vật cho thiết bị PCIe của mình. Tôi muốn giới thiệu cho người khác đọc cuốn sách Trình điều khiển thiết bị Linux, chương 3, để tìm hiểu thêm. Đó là lỗi thời nhưng bạn có thể chọn một số khái niệm cơ bản để giúp bạn tiếp tục. – user2205930

2

Nếu bạn chỉ muốn xuất bộ nhớ từ không gian hạt nhân vào không gian sử dụng và nhận được ngắt, suy nghĩ về UIO driver.

Với nó, tất cả các truy cập sẽ được thực hiện thông qua tệp/dev/uioX. Bạn có thể làm mmap() trên nó để xuất khẩu bộ nhớ và bạn có thể đọc (với một ngăn chặn đọc) để "bắt" gián đoạn.

UIO là hoàn toàn phù hợp cho PCIe, có already is a driver trong hạt nhân cho nó.

Các vấn đề liên quan