2014-03-03 8 views
0

저는 Linux에서 드라이버 개발을 처음 시작했습니다. 지정된 대상 주소에서 DMA read 작업을 실행하고 싶습니다. 그러나 수행 방법에 대한 기본 개념이 없습니다. 사운드 카드 용 새 드라이버를 작성해야합니까? 아니면 현재의 사운드 카드 드라이버가 제공하는 API (있는 경우)를 호출합니까?PCI 사운드 카드에서 DMA 작업을 트리거하는 방법

나는 내가 원하는 것은 (LDD3 Ch15에서)이 보이는 것을 상상할 수,

int dad_transfer(struct dad_dev *dev, int write, void *buffer, 
       size_t count) 
{ 
    dma_addr_t bus_addr; 

    /* Map the buffer for DMA */ 
    dev->dma_dir = (write ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 
    dev->dma_size = count; 
    bus_addr = dma_map_single(&dev->pci_dev->dev, buffer, count, 
           dev->dma_dir); 
    dev->dma_addr = bus_addr; 

    /* Set up the device */ 

    writeb(dev->registers.command, DAD_CMD_DISABLEDMA); 
    writeb(dev->registers.command, write ? DAD_CMD_WR : DAD_CMD_RD); 
    writel(dev->registers.addr, cpu_to_le32(bus_addr)); 
    writel(dev->registers.len, cpu_to_le32(count)); 

    /* Start the operation */ 
    writeb(dev->registers.command, DAD_CMD_ENABLEDMA); 
    return 0; 
} 

그러나 이것은, 사용자 공간 프로그램이나 모듈 무엇을해야 하는가? registers을 작성해야하는 대상과 방법을 알기 위해 장치 별 세부 정보를 어디에서 확인할 수 있습니까?

답변

1

당신이 몇 가지 질문이 여기에 묻혀있다, 그래서 한 번에 하나씩 취합니다

  1. 내가 새 드라이버를 작성하거나 일부 API 함수 호출을 호출해야 하는가? 그들은 가장 쉬운 옵션은 것 - 기존 드라이버가 사용자 공간에서 액세스 등의 기능이있는 경우

, 그래 당신이 그들을 사용해야합니다. 아직 존재하지 않으면 사용자 공간에서 커널의 DMA 엔진에 직접 액세스 할 수 없으므로 드라이버를 작성해야합니다. 운전 기사가 필요합니다.

  1. 사용자 공간 프로그램 또는 모듈이어야합니까?

저수준 커널 기능에 액세스 할 수 있도록 모듈이어야합니다. 포함 된 코드를 예로 들면 사용자 공간에서 "dma_map_single"을 호출하거나 PCI 장치의 장치 구조에 액세스 할 수 없습니다. 드라이버 모듈이나 정적 커널 드라이버가 필요한 커널 공간에 있어야합니다.

  1. 기기 별 세부 정보는 어디에서 얻을 수 있습니까?

(사용자가 Grep을 의미한다고 가정합니다.) 액세스하려는 장치에 대한 프로그래머 가이드를 보유해야합니다. 일반 사용자 설명서는 필요한 세부 수준 (등록 주소, 비트 패턴 등)을 갖지 않으므로 제조업체에게 문의하여 드라이버 작성자 가이드를 얻을 수 있습니다. 또한 커널 소스 코드에서 몇 가지 예를 찾을 수 있습니다. http://lxr.free-electrons.com/을 확인하여 전체 커널 소스의 검색 가능한 최신 목록을 확인하십시오./drivers /를 보면 시작을위한 몇 가지 예를 찾을 수 있습니다.