作者: Sam (甄峰) sam_code@hotmail.com
Sam需要研究一下USB Mouse device driver. 在Kernel 2.4时代,这块东西是由Input,event等配合组成的。而在kernel2.6中。Sam还不知道是如何运作的。
首先介绍HID:
HID是Human Interface Devices的缩写.翻译成中文即为人机交互设备.这里的人机交互设备是一个宏观上面的概念,任何设备,只要符合HID spec,都可以称之为HID设备
在make menuconfig中,选中USB Human Interface Device(full HID) support。则所有USB HID都会被驱动,其中包括USB Mouse。
在drivers/hid/usbhid/Kconfig看到这项对应的为:CONFIG_USB_HID
又在drivers/hid/usbhid/Makefile中看到:obj-$(CONFIG_USB_HID) += usbhid.o
也就是说:如果选中USB Human Interface Device(full HID) support为built-in.则usbhid.o会被built-in。
再在drivers/hid/usbhid/.usbhid.o.cmd中看到usbhid.o其实是由:hid-core.o,hid-quirks.o,hiddev.o组成的。
也就是说:当在Menuconfig中选中那一项后,这三个.o都会被built-in.
下一篇从driver角度学习。
2009年5月5日星期二
2009年5月4日星期一
Linux kernel 2.6下的modules编译与KBuild
作者: Sam (甄峰) sam_code@hotmail.com
Sam之前在Linux kernel 2.4下写过一些driver.但自从转到kernel 2.6之后,再也没有写过driver.所以很多具体的东西并不清楚。今天看了看文档,觉得变化挺大的。记下来。
在2.4内核中,只要自己写了driver,最多需要kernel头文件来配合编译。通常的CFLAGS为:
=-D__KERNEL__ -I$(KDIR) /include -DMODULE
但在2.6下面,不再是这样。模块的编译需要依赖配置过的内核源码,编译过程首先会到内核源码目标下,读取顶层的Makefile文件
Module编译模板如下:
#Makefile for linux2.6
ifneq ($(KERNELRELEASE),)
# call from kernel build system
scull-objs := main.o pipe.o access.o
obj-m := scull.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD)
clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
endif
解释:
KERNELRELEASE:由Kernel顶层Makefile中定义。
第一次运行中,KERNELRELEASE没有被定义,所以进入else
$(MAKE) -C $(KERNELDIR) M=$(PWD)
此处读取KERNELDIR中的顶层Makefile。读取后又返回本目录。继续执行本目录Makefile。
则此时KERNELRELEASE被定义。进入if.
if和else之间的为kbuild语法的语句.
Sam之前在Linux kernel 2.4下写过一些driver.但自从转到kernel 2.6之后,再也没有写过driver.所以很多具体的东西并不清楚。今天看了看文档,觉得变化挺大的。记下来。
在2.4内核中,只要自己写了driver,最多需要kernel头文件来配合编译。通常的CFLAGS为:
=-D__KERNEL__ -I$(KDIR) /include -DMODULE
但在2.6下面,不再是这样。模块的编译需要依赖配置过的内核源码,编译过程首先会到内核源码目标下,读取顶层的Makefile文件
Module编译模板如下:
#Makefile for linux2.6
ifneq ($(KERNELRELEASE),)
# call from kernel build system
scull-objs := main.o pipe.o access.o
obj-m := scull.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD)
clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
endif
解释:
KERNELRELEASE:由Kernel顶层Makefile中定义。
第一次运行中,KERNELRELEASE没有被定义,所以进入else
$(MAKE) -C $(KERNELDIR) M=$(PWD)
此处读取KERNELDIR中的顶层Makefile。读取后又返回本目录。继续执行本目录Makefile。
则此时KERNELRELEASE被定义。进入if.
if和else之间的为kbuild语法的语句.
订阅:
博文 (Atom)