PCI 디바이스 드라이버 작성중 DMA사용방법에 대하여 문의드립니다.

simgyosun의 이미지

안녕하세요.

현재 타겟보드는 Freescale사의 P2020디바이스를 쓰고 있구요
리눅스가 포팅되어있습니다.

P2020디바이스와 FPGA간에 PCIe가 연결되어있는데
일단 P2020에서 FPGA로 PCIe를 통하여 Single로 데이터가 전송되는 것 까지는 확인했습니다.

그런데 DMA를 사용해서 데이터를 전송해야 하는데 잘 안되네요.

디바이스 드라이버작성시 DMA는 어떻게 사용해야 하나요?

소스코드 첨부하였습니다.
DMA초기화부분과 전송부분을 봐주시면 감사...

무지하네요... ㅡㅇㅡ

File attachments: 
첨부파일 크기
Package icon clever_dev_pci_dma.zip2.47 KB
rainroot의 이미지


예전에 FPGA로 구현한 PCIe 디바이스를 리눅스에서 사용한적이 있습니다.

드라이버 소스를 보니. 초기화 및 버스마스터까지 모두 잘 개발하셨는데요.

여기서 PCI bus master 기능을 잘 이해해야하는데요.
PCI bus Master라는건 bus의 사용 권한이 CPU쪽 OS에 있는게 아니라 PCI쪽 디바이스에 있다고 생각하시면 됩니다.

CPU동작과 상관없이 PCI 디바이스쪽에서 Host쪽 memory(DDR같은)에 바로 write/read가 가능합니다.
이 memory 주소는 드라이버 초기화에서 적용됩니다.
psi->mmio_base[0] = mmio_start[0];
psi->mmio_base[1] = mmio_start[1];
psi->mmio_base[2] = mmio_start[2];

psi->mmio_vir[0] = pci_iomap(pdev, 0, mmio_len[0]);
psi->mmio_vir[1] = pci_iomap(pdev, 1, mmio_len[1]);
psi->mmio_vir[2] = pci_iomap(pdev, 2, mmio_len[2]);

PCI 디바이스는 이 주소에 특정값을 read/write를 하는 거죠.

그러므로 디바이스 드라이버는 별도로 DMA 함수를 사용할 필요가 없습니다.
PCI 디바이스가 DMA를 이용해서 Memory를 사용하기 때문이죠.

아마도... FPGA코딩하시는 분이 이 부분을 보시면 될 것 같네요.

pci가 처음에는 공부해야 이해되는 부분이 많이 있습니다. 먼저 스펙을 보시는게 좋을 것 같습니다.

간단하게 설명을 드렸지만... 저도 5년전에 했던 작업이라 기억이 가물가물하네요.

그럼 성공하시길..

simgyosun의 이미지

그렇다면 FPGA->CPU쪽으로 데이터를 Read/Write하면 CPU쪽에서는
Interrupt형태로 다 읽어갔는지 또는 다 썻는지에 해당됬을때 처리해주면 된다는 말씀이신가요?
CPU는 전적으로 FPGA가 어떻게 하느냐에 달렸군요. CPU에서 연속적으로 데이터를 전송할수는 없나 보네요..ㅎㅎ

DMA 메모리 영역을 FPGA가 사용할수 있게 psi->mmio_vir이 주소와 DDR영역의 주소를
Mapping만 시켜주면 되겠네요? 이것은 또 어떻게 해야 하나요?

답변 감사합니다. (^^)(__)

한줄기 희망의 빛이....

rainroot의 이미지


FPGA에서 DDR쪽으로 write하면 당연히 interrupt로 CPU로 알려줘야죠.ㅎㅎ 그래야 CPU에서 이를 알고 처리를 하겠죠.

음... FPGA->pcie->pcie(host)->DDR 이런식으로 흘러가는데요. 메모리 멤핑은 phy address를 적어주어야합니다.
pci 메모리 영역은 사실 pci config영역을 읽어서 kernel이 알아서 메모리를 할당해 줍니다. 일반적인 경우죠.
하지만 다른 경우엔 pci config영역 중 확장영역을 이용해서 DDR의 phy address를 적어주고, 이 address로 통신을 합니다.

5년전에 했던거라. 기억이 가물가물.

혹시 ethernet 캡쳐카드를 만드시는 건가요? 캡쳐카드면 이것 저것 할일이 많아요..ㅎㅎ 아마 드랍이 많이 생길겁니다.
이걸 방지하기 위해 많은 노력이 필요하죠.ㅎㅎㅎ

FPGA하시는 분도 고생 많이 하실거에요. 지난번 답변 처럼... 공부를 많이 하시는게 좋을것 같아요.
하지만 한번 알고 나면 pci가 정말 편리한 인터페이스라는 걸 이해 하실 겁니다.

그럼 성공하시길..

simgyosun의 이미지

ㅎㅎ
캡쳐카드는 아니구요
단순하게 FPGA와 데이터 송/수신용입니다.
기존에 Local Bus로 사용하다가 속도가 느려서 PCIe로 바꾸는 거거든요.

CPU쪽에서 FPGA로 DMA사용은 전혀 안되나요?

혹시 DDR to DDR DMA예제라도 있을까요?

감사...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.