Linux驅動開發--Linux驅動開發遇到的問題

1、顯示錯誤:unknown field 'ioctl' specified in initializer

解決辦法,查看內核include/linux/fs.h文件,發現裏邊定義的struct file_operations中沒有ioctl,這裏我們用.unlocked_ioctl取代,形參去掉 struct inode*。

2、在應用程序中,將ioctl替換爲unlocked_ioctl後,會出現以下錯誤:undefined reference to `unlocked_ioctl'。因爲系統調用ioctl是沒有改變的,還是原來的系統調用接口,只是系統調用的實現中,ioctl()變成了unlocked_ioctl,在應用層你根本不用關注內核中的這些實現上的改變,你只需要按照系統調用的用法用就可以了。所以把應用程序裏的unlocked_ioctl改爲ioctl,編譯,OK,通過。

3、驅動編譯完成,在開發板上insmod,出現以下錯誤:

WARNING: at lib/kobject.c:595 kobject_put+0x50/0x64()
kobject: '撲' (cbc60a00): is not initialized, yet kobject_put() is being called.
---[ end trace da227214a82491b9 ]---
insmod: cannot insert 'led_dev.ko': Cannot allocate memory

原來是忘了寫內存申請的代碼,添加kmalloc和memset。

4、再次insmod,出現下列錯誤代碼:

Unable to handle kernel paging request at virtual address 7f008820
pgd = cbc70000
[7f008820] *pgd=00000000
Internal error: Oops: 5 [#1]
Modules linked in: led_dev(+)
CPU: 0    Tainted: G        W    (3.0.1 #439)
PC is at led_init+0xa8/0x108 [led_dev]
LR is at kobj_map+0x144/0x154
pc : [<bf0020a8>]    lr : [<c0246e70>]    psr: 60000013
sp : cbc6bf10  ip : cbc6beb0  fp : cbc6bf24
r10: 00000000  r9 : bf002000  r8 : cbc6a000
r7 : 00000000  r6 : bf0002bc  r5 : 00000000  r4 : 00000000
r3 : 00000000  r2 : 00000000  r1 : 7f008000  r0 : 00000000
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 00c5387d  Table: 5bc70008  DAC: 00000015
Process insmod (pid: 112, stack limit = 0xcbc6a268)
Stack: (0xcbc6bf10 to 0xcbc6c000)
bf00:                                     00000000 c07463c0 cbc6bf7c cbc6bf28
bf20: c00343c8 bf00200c cbc6bf64 cbc6bf38 c0073e24 00000000 00000000 00000000
bf40: 00000000 0000ef52 000d5bf9 bf0002bc 00000000 0000ef52 000d5bf9 bf0002bc
bf60: 00000000 c0034ce8 cbc6a000 00000000 cbc6bfa4 cbc6bf80 c0085960 c0034398
bf80: c00e8738 c00e8610 402004a8 000dfcf8 00000000 00000080 00000000 cbc6bfa8
bfa0: c0034b40 c00858e0 402004a8 000dfcf8 00b5d038 0000ef52 000d5bf9 ffff5f01
bfc0: 402004a8 000dfcf8 00000000 00000080 00000069 00000001 be9c2e64 be9c2e68
bfe0: be9c2e68 be9c2b14 00021cfc 402c1d74 60000010 00b5d038 5fffe821 5fffec21
[<bf0020a8>] (led_init+0xa8/0x108 [led_dev]) from [<c00343c8>] (do_one_initcall+0x3c/0x188)
[<c00343c8>] (do_one_initcall+0x3c/0x188) from [<c0085960>] (sys_init_module+0x8c/0x1a4)
[<c0085960>] (sys_init_module+0x8c/0x1a4) from [<c0034b40>] (ret_fast_syscall+0x0/0x30)
Code: e59f0060 eb52980e ea00000b e59f1058 (e5910820)
---[ end trace da227214a82491b9 ]---
Segmentation fault

最後是各種百度,各種谷歌,參考別人的驅動,發現它們的開發板硬件地址並不是自己寫的頭文件,而是調用mach中已經定義好的頭文件,好吧,尋找相應開發板,相應端口的地址頭文件,在驅動文件中添加以下頭文件:

#include <mach/map.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank-m.h>
Ok,打完收工,開發板,測試。運行無阻。完成。

5、在做到DS18B20溫度測試模塊驅動的時候,看到網上的代碼有些函數可以直接對引腳的功能進行設置,比如:s3c2410_gpio_cfgpin(DQ_PIN, DQ_PIN_OUTP); 但是對應於我的s3c6410的開發板就不知道用什麼函數了,網上找了半天,發現以上函數是在#include <plat/gpio-cfg.h>中,6410中對應的函數爲:extern int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);

6、最近學習移植linux內核,移植了新的linux內核以及掛載了新的NFS之後, 重新測試led驅動,發現安裝模塊以後,運行測試程序會出現以下錯誤:

-/bin/sh: ./main: not found(main爲主機上編譯好的測試程序)

原因:

編譯busybox的時候選擇了靜態編譯:

Build Options->

Build BusyBox as a static binary (no shared libs)

Build with Large File Support (for accessing file>2GB)

如果選擇 Build BusyBox as a static binary (no shared libs) 方式進行編譯時,所需的庫已經與程序靜態地鏈接在一起,這些程序不需要額外的庫就可以單獨運行,但是自己編寫的程序在文件系統上運行必須採用靜態編譯,否則會報諸如:bin/sh: main :not found的錯誤。

靜態編譯如:

arm-linux-gcc –static main.c –o main

7.按照普通方法安裝配置tftp,並且關閉了防火牆,但是在開發板上tftp主機,總會報錯:

tftp: server error: (0) Permission denied

解決辦法:

修改文件 /etc/sysconfig/selinux,設定其中的
SELINUX=disabled
然後重啓電腦即可

發佈了16 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章