6.5号——内核文件系列

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   变量名= 值

 

  

  

 

原文地址:https://www.cnblogs.com/edan/p/9138779.html