1.一般的io函数芯片厂商都已经写进内核里了,在内核源码下的source/linux-3.4.112/Documentation/gpio.txt中
如:gpio_request() gpio_direction_input() gpio_set_value() gpio_get_value()
gpio_free(); gpio_to_irq();等
如果需要复杂的功能,则这些标准的io函数则做不到,需要特殊的函数,但是那些特殊的函数不是标准的函数,每个芯片厂商设计的都不同,
如:三星的在orangepi_sdk/source/linux-3.4.112/drivers/gpio/gpio-samsung.c
但是全志的并不在这里,而是在编译内核时生成的script.bin文件中
2. 修改模块参数
modprobe g_ether dev_addr ="40:30:11:22:33:44"
modprobe:只需要相对路径,而后面的g_ether是一个网路模块g_ether.ko, dev_addr为模块的mac地址
3.如果一个模块里有多个.c文件,如何写makefile文件生成一个.KO
obj-m += mytest.o
mytest-objs := test.o a.o b.o d.o //固定语法,将test.o a.o b.o d.o 加入到mytest.o 中
4.如果工作中只给了一个动态编译的库,我们怎么取调用?
如通过arm-linux-gnueabihf-ld cr myfunc.a a.o b.o d.o
如果我们只有一个myfunc.a的库,那么在写makefile时只需要将myfunc.a当作.o文件使用就可以了
obj-m += mytest.o
mytest-objs :=test.o myfunc.a
5.static 定义的变量只能在模块内引用,若想在模块外调用怎么办?
答:用引用符号
如:EXPORT——SYMBOL(函数名) //导出函数,此时该函数则为全局函数
cat /proc/kallsyms | grep myfunc //myfunc为函数名
查看内核符号表,查看信息,如全局变量(T)、局部变量(t)等。
如果想要调用外部函数怎么声明?
extern void myfunc(char *line);
6.如果想要在加载模块时改变某个参数的值,怎么办?
解:1.将已经声明的变量声明为模块驱动的参数,如:
#include <linux/moduleparam.h> //需要加载的头件
static int num=88;//声明一个整型变量为88,当加载驱动模块时不指定变量的值则默认为88
moudle_param(变量名,类型,权限) //如:module_param(num,int ,0644)
2.加载驱动模块时指定模块参数的具体的值
insmod test.ko 变量名= 值