天天看點

linux驅動開發——子產品基礎知識

1.子產品參數

/*
 *
 * 說明:用于示範子產品參數的基本使用方法,加載該子產品
 *       時,在指令行中添加val=xxx,則在控制台中将會
 *       列印出對應的參數值,否則列印0。
 */

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

static int val = 0;
/*
 * 子產品的入口函數沒有參數,要在子產品加載時指定某些特定
 * 的參數,需要通過module_param宏來進行相應處理。後面
 * 的0表示權限,通常設為0即可。
 */
module_param(val, int, 0);

static int __init fsmod_init(void)
{
	printk(KERN_INFO "Hello, Farsight!\n");
	printk(KERN_INFO "val = %d\n", val);
	return 0;
}

static void __exit fsmod_exit(void)
{
	printk(KERN_INFO "Goodbye, Farsight!\n");
}

module_init(fsmod_init);
module_exit(fsmod_exit);

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("xxxx <[email protected]>");
MODULE_DESCRIPTION("This is an example for linux driver module");
           

2.一個子產品由多個C檔案組成的編譯方法

foo.c

#include <linux/kernel.h>

void foo(void)
{
	printk(KERN_INFO "I am foo\n");
}
           

mod.c

/*
 *
 * 說明:用于示範由多個c檔案構成一個子產品的編譯方法。
 */

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

/*
 * foo 函數在其他地方定義
 */
extern void foo(void);

static int __init fsmod_init(void)
{
	printk(KERN_INFO "Hello, Farsight!\n");
	foo();
	return 0;
}

static void __exit fsmod_exit(void)
{
	printk(KERN_INFO "Goodbye, Farsight!\n");
}

module_init(fsmod_init);
module_exit(fsmod_exit);

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("xxxx <[email protected]>");
MODULE_DESCRIPTION("This is an example for linux driver module");
           

Makefile

ifeq ($(KERNELRELEASE),)

PWD := $(shell pwd)
KERNELDIR ?= /home/Kevin/Workspace/FSC100/kernel/linux-2.6.35-farsight
INSTALLDIR ?= /home/Kevin/Workspace/FSC100/rootfs

modules:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) INSTALL_MOD_PATH=$(INSTALLDIR) modules_install
clean:
	rm -rf *.o *.ko *.mod.c .*.cmd modules.order Module.symvers .tmp_versions

else
# 指定子產品的名稱
obj-m := fsmod.o
# 由多個檔案編譯而成的子產品,用子產品名加-objs字尾,然後給出該子產品的依賴檔案清單,
# 這樣就可以自動編譯多個源檔案,進而編譯出最終的子產品
fsmod-objs := mod.o foo.o

endif
           

3.子產品符号導出

/*
 * 說明:用于示範子產品導出符号的方法。
 */

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

static void foo(void)
{
	printk(KERN_INFO "I am foo\n");
}
/*
 * 通過EXPORT_SYMBOL來導出符号,這樣其他的子產品就可以
 * 引用該符号。如果用EXPORT_SYMBOL_GPL來導出符号,則
 * 不滿足GPL協定的子產品不能引用該符号。
 */
EXPORT_SYMBOL(foo);

static int __init fsfoo_init(void)
{
	printk(KERN_INFO "fsfoo init\n");
	return 0;
}

static void __exit fsfoo_exit(void)
{
	printk(KERN_INFO "fsfoo exit\n");
}

module_init(fsfoo_init);
module_exit(fsfoo_exit);

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Kevin Jiang <[email protected]>");
MODULE_DESCRIPTION("This is an example for linux driver module");
           

4.多個子產品同時編譯

//fsfoo.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

static void foo(void)
{
	printk(KERN_INFO "I am foo\n");
}
/*
 * 通過EXPORT_SYMBOL來導出符号,這樣其他的子產品就可以
 * 引用該符号。如果用EXPORT_SYMBOL_GPL來導出符号,則
 * 不滿足GPL協定的子產品不能引用該符号。
 */
EXPORT_SYMBOL(foo);

static int __init fsfoo_init(void)
{
	printk(KERN_INFO "fsfoo init\n");
	return 0;
}

static void __exit fsfoo_exit(void)
{
	printk(KERN_INFO "fsfoo exit\n");
}

module_init(fsfoo_init);
module_exit(fsfoo_exit);

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Kevin Jiang <[email protected]>");
MODULE_DESCRIPTION("This is an example for linux driver module");

           
//fsmod.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

extern void foo(void);

static int __init fsmod_init(void)
{
	printk(KERN_INFO "fsmod init\n");
	foo();
	return 0;
}

static void __exit fsmod_exit(void)
{
	printk(KERN_INFO "fsmod exit\n");
}

module_init(fsmod_init);
module_exit(fsmod_exit);

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Kevin Jiang <[email protected]>");
MODULE_DESCRIPTION("This is an example for linux driver module");
           

Makefile

ifeq ($(KERNELRELEASE),)

PWD := $(shell pwd)
KERNELDIR ?= /home/Kevin/Workspace/FSC100/kernel/linux-2.6.35-farsight
INSTALLDIR ?= /home/Kevin/Workspace/FSC100/rootfs

modules:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) INSTALL_MOD_PATH=$(INSTALLDIR) modules_install
clean:
	rm -rf *.o *.ko *.mod.c .*.cmd modules.order Module.symvers .tmp_versions

else

obj-m := fsmod.o
obj-m += fsfoo.o

endif