哈哈河东勋妈妈金玉静:Linux下单独编译一个模块

来源:百度文库 编辑:偶看新闻 时间:2024/04/20 17:15:03

模块编译及makefile  

2010-05-07 14:38:02|  分类: 个人日记 |  标签: |字号大中小 订阅

      周四。
    加任务了,调试GT系列的串口程序,根据外面出问题的点位反应的现象描述是,232设备死了,应用层重新打开设备也没有数据接收,232中断无增加
    初步判断肯定是232处理逻辑出了问题,中断无增加,说明已经进入某种错误状态了。
    我的初步判断是某些错误状态没有处理,导致设备一直处于错误状态,因为设备使用了发送和接收的fifo和中断处理,我觉得很可能是寄存器LSR、FSR等status错误位没有清掉,因为看代码,中断处理过程当中确实也只有响应中断但是不加以处理。
    我们的模块全部是编译进内核的,所以如果不升级处理,是没有办法调试的。现在我能想到的和正在做的就是把这些模块重新加载,用insmod再次初始化这些模块,然后去查看模块寄存器的状态,并争取找到原因。因为一旦变成内核的模块,很多原来不能操作的资源也就开放了。
    现在首先要做的就是编译单独的.ko模块,并用insmod加载,并在该对应的模块上增加若干可以查询和设置寄存器状态的操作。
    用make menuconfig可以修改模块编译方式、进内核、预留模块方式或者完全不在内核工程中编译。
    1,首先如果选择预留模块方式编译,make uImage不会把该模块编译进内核,但是会把模块用make module的方式编译出来,可以insmod了直接。
    2,如果想脱离原来的内核,建立单独的工程,写自己的makefie单独编译成模块,需要这么做。a,把需要的.c和对应要包含的.h文件拉出来单独放在一起。b,写一个makefile,它很可能是这样子的:
obj-m := davinci_rs232_uart1.o
#kernel_dir := /lib/modules/$(shell uname -r)/build
kernel_dir := /home/driver_zhangm/ti-davinci_DMEM/
pwd := $(shell pwd)
all:
 $(MAKE) -C $(kernel_dir) M=$(pwd) modules
至于为什么是这样子的,我暂时还不理解。只能说一下我当前的理解。
首先,目标文件必须定义为obj-m = %.c文件对应的%.o文件,obj-m不能换成其他类似bin之类的名字,试过了不行,%也必须完全匹配。有没有其他替代方法暂时不知道。只能确定这些要求是内核makefie定义的环境变量要求的。
其次,内核dir指定了编译内核的目录路径。如果要编译成直接加载到当前操作系统能够运行的模块就采用注释掉那行路径。否则就要采用当前运行的uImage编译的路径
再者 pwd制定了放置目标文件的路径,最后一行是执行命令,采用之前定义的内核路径、环境变量的MAKE和放置路径等就可以了Linux下单独编译一个模块
声明:本文综合一些网络文摘而成

一,引例:比如声卡Irq 和 IO 不对,可到 /usr/src/linux/drivers/sound目录下.
gcc -o configure configure.c
./configure
选好IO,IRQ 等等,
make
cp sound.o /lib/modules/2.0.34/misc
rmmod sound
insmod sound init_trace=1
测试一下.
直到成功为止.
这样可比在 /usr/src/linux 下, make menuconfig ;
make dep;make clean;make zImage;.... 好多了.

二,另外几篇文章的总结:尝试编译一个CMI的声卡驱动模块

1.在/usr/src/linux-xxxx/configs目录下有若干编译内核所用的配置。我们每次保存的配置存放于此,选择我们想要的配置,将它复制到/usr/src/linux-xxxx目录下,改名为.config。

cp /usr/src/linux-xxxx/configs/kernel-2.4.19-arm.config /usr/src/linux-xxxx/.config

在/usr/src/linux-xxxx/目录下的.config文件中,能看到 CONFIG_XXXX_XXXX=y或者#CONFIG_XXXX_XXXX is not set的字样。找到#CONFIG_SOUND_CMPCI is not set这一行,改为CONFIG_SOUND_CMPCI=m,其中m的意思就是编译成模块。然后把其它所有的CONFIG_XXXX_XXXX=m全部注释掉。

2.接着在/usr/src/linux-2.4.19目录下直接执行make modules,仅仅几秒钟,编译就完成了。

千万不能接着执行make modules_install,它会把系统中现有的模块删除,只安装新编译的模块。

3.进入/usr/src/linux- 2.4.19/drivers/sound/,找到cmpci.o文件,

cp /usr/src/linux-2.4.19/drivers/sound/cmpci.o /lib/modules/2.4.20/kernel/drivers/sound/

有时需给/lib/modules/2.4.1*/modules.dep文件加上如下字:/lib/modules/KNL_VERSION/kernel/drivers/sound/cmpci.o

执行depmod后,用modprobe cmpci把模块插入内核。再用lsmod命令就可以看到cmpci已经被插入内核了。

如何编写Linux的设备驱动程序 2002-12-25 06:02:00
linux内核模块和驱动程序的编写 2001-08-30 15:00:00
Linux操作系统网络驱动程序编写