ldd3 源碼編譯之 scullc 字符設備驅動

轉自:http://blog.chinaunix.net/uid-25381054-id-3261527.html

使用內核版本-linux-3.2


錯誤1:

  1. make -/lib/modules/3.2.0/build M=/home/wrk/works/drivers/ldd3/examples/scullc LDDINC=/home/wrk/works/drivers/ldd3/examples/scullc modules
  2. make[1]: Entering directory `/home/wrk/works/drivers/linux-kernel/linux-3.2'
  3. scripts/Makefile.build:49: *** CFLAGS was changed in "/home/wrk/works/drivers/ldd3/examples/scullc/Makefile". Fix it to use ccflags-y. Stop.
  4. make[1]: *** [_module_/home/wrk/works/drivers/ldd3/examples/scullc] Error 2
  5. make[1]: Leaving directory `/home/wrk/works/drivers/linux-kernel/linux-3.2'
  6. make: *** [modules] Error 2
這個錯誤還比較好解決,像提示的那樣在Makefile中用ccflags-y替換CFLAGS 


錯誤2:

  1. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:52:1: error: unknown type name ‘kmem_cache_t’

這是因爲kmem_cache_t結構被換成了kmem_cache。而kmem_cache定義在<linux/slab_def.h>和<linux/slub_def.h>。但是你並不需要包含這兩個文件中的一個。因爲<linux/slab.h>會根據CONFIG_SLUB等來判斷具體包含<linux/slab_def.h>,還是<linux/slub_def.h>。故例程中需要將

kmem_cache_t *scullc_cache;
改爲:
struct kmem_cache *scullc_cache;


錯誤3:

  1. /home/wrk/works/drivers/ldd3/examples/scullc/main.c: In function ‘scullc_defer_op’:
  2. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:437:54: error: macro "INIT_WORK" passed 3 arguments, but takes just 2
  3. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:437:2: error: ‘INIT_WORK’ undeclared (first use in this function)
這裏需要將

  1. INIT_WORK(&stuff->work, scull_do_deferred_op, stuff);
改爲:

  1. INIT_WORK(&stuff->work, scull_do_deferred_op);
並且將scullc_do_deferred_op函數改爲
  1. static void scullc_do_deferred_op(struct work_struct *p)
  2. {
  3.         struct async_work *stuff = container_of(p, struct async_work, work);
  4.         aio_complete(stuff->iocb, stuff->result, 0);
  5.         kfree(stuff);
  6. }


錯誤4: 
  1. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:467:2: error: unknown field ‘ioctl’ specified in initializer
這裏因爲內核接口變化需要將.ioctl改爲 .unlocked_ioctl

錯誤5:

  1. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:558:4: error: too many arguments to function ‘kmem_cache_create’
函數kmem_cache_create的原型已經改變:
struct kmem_cache *kmem_cache_create(const char *, size_t, size_t, unsigned long, void (*)(void *));故調用它的時候應該將參數做出相應的改變。需要將最後一個NULL去掉。

下面來解決warning:
  1. /home/wrk/works/drivers/ldd3/examples/scullc/main.c: In function ‘scullc_defer_op’:
  2. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:437:2: warning: assignment from incompatible pointer type [enabled by default]
  3. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:438:2: warning: passing argument 1 of ‘schedule_delayed_work’ from incompatible pointer type [enabled by default]
  4. include/linux/workqueue.h:363:12: note: expected ‘struct delayed_work *’ but argument is of type ‘struct work_struct *’
  5. /home/wrk/works/drivers/ldd3/examples/scullc/main.c: At top level:
  6. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:467:2: warning: initialization from incompatible pointer type [enabled by default]
  7. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:467:2: warning: (near initialization for ‘scullc_fops.unlocked_ioctl’) [enabled by default]
  8. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:470:2: warning: initialization from incompatible pointer type [enabled by default]
  9. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:470:2: warning: (near initialization for ‘scullc_fops.aio_read’) [enabled by default]
  10. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:471:2: warning: initialization from incompatible pointer type [enabled by default]
  11. /home/wrk/works/drivers/ldd3/examples/scullc/main.c:471:2: warning: (near initialization for ‘scullc_fops.aio_write’) [enabled by default]
1.把
  1. struct async_work {
  2. struct kiocb *iocb;
  3. int result;
  4. struct work_struct work;
  5. };
改爲:
  1. struct async_work {
  2. struct kiocb *iocb;
  3. int result;
  4. struct delayed_work delayed_work;
  5. }
然後把:
  1. INIT_WORK(&stuff->work, scull_do_deferred_op, stuff);
  2. schedule_delayed_work(&stuff->work, HZ/100);
改爲:
  1. INIT_DELAYED_WORK(&(stuff->delayed_work), scullc_do_deferred_op);
  2. schedule_delayed_work(&(stuff->delayed_work), HZ/100);
再編譯即可通過。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章