カスタム ハードウェア用の SPI ドライバーを実装しようとしています。私は spidev ドライバーのコピーから始めました。これは、私が必要とするほとんどすべてをサポートしています。
コマンドビット(読み取り/書き込み)、アドレス、および任意の量のデータの3つの部分を持つプロトコルを使用しています。
これを行うには、単純に lseek 機能を追加するのが最善の方法であると想定していました。目的のアドレスを「シーク」してから、任意の数のバイトを読み書きします。新しいドライバーの file_operations でカスタム .llseek を作成しましたが、その関数が呼び出されるのを見たことがありません。fseek()、lseek()、および pread() を使用してみましたが、これらの関数のいずれも新しい my_lseek() 関数を呼び出していないようです。すべての呼び出しで「errno 29 ESPIPE Illegal Seek」が報告されます
デバイスは board.c ファイルで定義されています。
static struct spi_board_info my_spi_board_info[] __initdata = {
[0] = {
.modalias = "myspi",
.bus_num = 1,
.chip_select = 0,
.max_speed_hz = 3000000,
.mode = SPI_MODE_0,
.controller_data = &spidev_mcspi_config,
}, ...
主に私が見つけた例が filp->f_pos を参照しているため、devファイルが作成される方法に何かがあるのではないかと思います
static int myspi_llseek(struct file *filp, loff_t off, int whence)
{
...
newpos = filp->f_pos + off;
...
}
私の質問は次のとおりです。このドライバー (わずかに変更された spidev) が「シーク」呼び出しをサポートする方法はありますか? どの時点で errno 29 を返すように定義されますか? 新しいドライバーから始めなければならず、spi_board_info() と spi_register_board_info() のセットアップに頼ることができなくなりますか?
/drivers/spi ディレクトリ (spi-dw) 内の 1 つのドライバーのみが lseek を参照し、default_llseek 実装を使用します。すべてを立ち上げて実行するために私たちが思いついた「ハック」がいくつかありますが、私はそれを正しく行う方法を学びたい傾向があります.
どんな提案でも大歓迎です!(PS、OMAP Android システムのカーネル バージョンは 3.4.48 です)