今日まで、PIO転送のIDE HDDの、PIO書き込み部分をDMA化する作業をしていました。
Linuxに用意されているDMA関連処理(request_dmaとか)を使用してやるのですが、どうもこの処理にいくらか問題があるようで、ずいぶんハマりました。
また、IDEドライバも処理がよくわからなくて、大変でした。
実際にPIO転送する部分をDMAに置き換えることにしていたのですが、どうやらそこに渡される書き込みサイズは実際のデータの1/4のサイズが渡されるらしく、知らずに元のサイズのまま書き込みをしていたら、タイムアウトが発生してしまっていました。
本当はIDEのドライバを上から順に追っていけばよいのですが、あまり時間がなかったもので…。
結局全部は調べ切れていませんが、現象や関連処理から察するに、4KBのデータをPIOに書き込むと完了割り込みか何かが発生し、それで書き込み処理が完結するのだと思います。
かずは1KBしか書いていなかったので、書き込みが完了しなくて割り込みが発生せず、タイムアウトになってしまっていたのではないかと思います。
動いたときは嬉しかったです。この楽しさがあるから組み込みはやめられませんね。
アプリ開発では味わえない感覚です。