3

Ubuntu 10.04 LTS でビデオ ドライバーをコンパイルしようとしていますが、エラーは次のとおりです。

**************************************************************************
* Building Techwell TW686x driver...                                     *
* Type "make help" for a list of available targets.                      *
**************************************************************************

make -C /lib/modules/`uname -r`/build M="/home/v4/driver-686x-0.1.1" clean
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-43-generic'
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-43-generic'
make -C /lib/modules/`uname -r`/build M="/home/v4/driver-686x-0.1.1" modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-43-generic'
  CC [M]  /home/v4/driver-686x-0.1.1/tw686x-core.o
  CC [M]  /home/v4/driver-686x-0.1.1/tw686x-video.o
  CC [M]  /home/v4/driver-686x-0.1.1/tw686x-i2c.o
  CC [M]  /home/v4/driver-686x-0.1.1/tw686x-device.o
  CC [M]  /home/v4/driver-686x-0.1.1/i2c-sw.o
  CC [M]  /home/v4/driver-686x-0.1.1/tw686x-alsa.o
  CC [M]  /home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.o
/home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.c:341: warning: initialization from incompatible pointer type
/home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.c:343: warning: initialization from incompatible pointer type
/home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.c:344: error: unknown field ‘vaddr’ specified in initializer
/home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.c:344: warning: excess elements in struct initializer
/home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.c:344: warning: (near initialization for ‘qops’)
/home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.c: In function ‘videobuf_queue_dma_contig_init_tw’:
/home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.c:357: warning: passing argument 2 of ‘videobuf_queue_core_init’ discards qualifiers from pointer target type
include/media/videobuf-core.h:197: note: expected ‘struct videobuf_queue_ops *’ but argument is of type ‘const struct videobuf_queue_ops *’
make[2]: *** [/home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.o] Error 1
make[1]: *** [_module_/home/v4/driver-686x-0.1.1] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-43-generic'
make: *** [modules] Error 2

私のカーネルは 2.6.32-43 です。私のCは非常に錆びているので、教祖に尋ねています。私が見る限り、問題はファイル videobuf-core.h の変数 videobuf_queue_ops を参照しており、これらの場所で見つかりました:

/usr/src/linux-headers-2.6.24-24/include/media/videobuf-core.h
/usr/src/linux-headers-2.6.32-43/include/media/videobuf-core.h
/usr/src/linux-headers-2.6.24-32/include/media/videobuf-core.h

問題のファイル (抜粋) videobuf-dma-contig-tw.c は次のとおりです。

static struct videobuf_qtype_ops qops = {
    .magic        = MAGIC_QTYPE_OPS,

    .alloc        = __videobuf_alloc,
    .iolock       = __videobuf_iolock,
    .mmap_mapper  = __videobuf_mmap_mapper,
    .vaddr        = __videobuf_to_vaddr,
};

ヘッダー ファイルの videobuf_qtype_ops の定義は次のようになります。

struct videobuf_queue_ops {
    int (*buf_setup)(struct videobuf_queue *q,
             unsigned int *count, unsigned int *size);
    int (*buf_prepare)(struct videobuf_queue *q,
               struct videobuf_buffer *vb,
               enum v4l2_field field);
    void (*buf_queue)(struct videobuf_queue *q,
              struct videobuf_buffer *vb);
    void (*buf_release)(struct videobuf_queue *q,
                struct videobuf_buffer *vb);
};

#define MAGIC_QTYPE_OPS 0x12261003

/* Helper operations - device type dependent */
struct videobuf_qtype_ops {
    u32                     magic;

    void *(*alloc)      (size_t size);
    void *(*vmalloc)    (struct videobuf_buffer *buf);
    int (*iolock)       (struct videobuf_queue* q,
                 struct videobuf_buffer *vb,
                 struct v4l2_framebuffer *fbuf);
    int (*mmap)     (struct videobuf_queue *q,
                 unsigned int *count,
                 unsigned int *size,
                 enum v4l2_memory memory);
    int (*sync)     (struct videobuf_queue* q,
                 struct videobuf_buffer *buf);
    int (*video_copy_to_user)(struct videobuf_queue *q,
                 char __user *data,
                 size_t count,
                 int nonblocking);
    int (*copy_stream)  (struct videobuf_queue *q,
                 char __user *data,
                 size_t count,
                 size_t pos,
                 int vbihack,
                 int nonblocking);
    int (*mmap_free)    (struct videobuf_queue *q);
    int (*mmap_mapper)  (struct videobuf_queue *q,
                struct vm_area_struct *vma);
};

このヘッダー ファイルを変更する必要がありますか? 何が修正されているのか、あるいは Linux ファイルを変更する必要があるのか​​ どうかもわかりません-恐ろしいことです!

ご協力いただきありがとうございます。

4

2 に答える 2

1

この部分だけで

/home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.c:343: 警告: 互換性のないポインター型からの初期化
/home/v4/driver-686x-0.1.1/videobuf-dma-contig -tw.c:344: エラー: 初期化子 /home/v4/driver-686x-0.1.1/videobuf-dma-contig-tw.c:344 で指定された不明なフィールド 'vaddr'
: 警告: 構造体初期化子の余分な要素

初期化子と構造体が異なる型、異なるフィールド名、異なる数の要素を使用していることを示しています。

間違いなく正しいインクルード ファイルではありません。:-)

どのバージョンを使用する必要があるかを判断し、1 つがインクルード パスにあることを確認する必要があります (他のバージョンではありません)。

于 2012-09-28T12:36:26.973 に答える
1

何らかの理由で、コンパイラはこの部分を好まない:

static struct videobuf_qtype_ops qops = {
    .magic        = MAGIC_QTYPE_OPS,

    .alloc        = __videobuf_alloc,
    .iolock       = __videobuf_iolock,
    .mmap_mapper  = __videobuf_mmap_mapper,
    .vaddr        = __videobuf_to_vaddr,
};

コンパイラは、エラーが発生した行番号を示しました。

videobuf-dma-contig-tw.c: 344 : エラー: 初期化子で指定された不明なフィールド 'vaddr'

ここで問題になるのは、なぜ にvaddrメンバーがいないのかということですstruct videobuf_qtype_ops。未満かもしれ#ifませんが、確かなことはわかりません。struct videobuf_qtype_opsこのファイルでは定義されていません。

あなたはこれを自分で見たはずです。関係のないコードをたくさん投稿することは、人々の時間の無駄です。

于 2012-09-28T12:38:30.560 に答える