龙芯俱乐部开源技术社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2570|回复: 0

内核配置驱动

[复制链接]

52

主题

125

帖子

4661

积分

论坛元老

Rank: 8Rank: 8

积分
4661
发表于 2017-8-7 10:49:30 | 显示全部楼层 |阅读模式
内核有很多文件,但不是每个文件都是必须编译的,这就是内核裁剪。内核裁剪是通过
配置内核编译选项来裁剪的。在源码根目录下使用命令进行配置。
make ARCH=mips CROSS_COMPILE=mipsel-linux- menuconfig
其中驱动模块也能像配置菜单那样,将驱动配置到内核中。配置步骤如下:
1)拷备 hello.c 到源码目录的 drivers/char 目录下。
2)修改 drivers/char 目录下的 Konfig,添加代码:
config HELLO_MODULE
tristate " Hello test module "
depends on LS1C_MACH
help
This is first driver for hello
依赖定义 depends on 或 requires 指此菜单的出现是否依赖于另一个定义。
这样当 make menuconfig 时 ,将会出现 Hello test module 选项。该 HELLO_MODULE 配
置项只对 LS1C_MACH 处理器有效,即只有在选择了 LS1C_MACH,该菜单才可见(可配置)。
LS1C_MACH 处理器的选择在内核目录下/Arch/Mips/Loongson/Kconfig 文件中定义
config LS1C_MACH
bool "Loongson 1C board"
select BOOT_ELF32
select CEVT_R4K if ! MIPS_EXTERNAL_TIMER
select CSRC_R4K if ! MIPS_EXTERNAL_TIMER
select SYS_HAS_CPU_LOONGSON1C
# select CPU_HAS_WB
select DMA_NONCOHERENT
select IRQ_CPU
select SYS_HAS_EARLY_PRINTK
select SYS_SUPPORTS_32BIT_KERNEL
select SYS_SUPPORTS_HIGHMEM
select SYS_SUPPORTS_LITTLE_ENDIAN
select USB_ARCH_HAS_HCD
help
GZ Loongson 1C family machines utilize the ls232 revision of
Loongson processor.
------------
3)修改 driver/char 目录下的 Makefile,添加内容:
obj-$(CONFIG_HELLO_MODULE) += hello.o
当运行 make menucofig 时,会发现 Hello test module 选项,假如选择了此项。该选择就
会保存在.config 文档中。当编译内核时,将会读取.config 文档,当发现 HELLO_MODULE 选
项为 yes 时,系统在调用/driver/char/下的 makefile 时,将会把 hello.o 加入到内核中。即
可达到编译时内核的目的。
4)回到 linux 源码的根目录,使用 make menuconfig 命令进行配置。
进入 Device Driver-->Character devices-->后可以看如图的配置。
------
保存配置后,如上图所示保存为<M>,即以模块方式加载进内核,如果保存为<*>,表
示编译进内核。输入 make modules 命令就可以编译模块。
root@ubuntu:~/Downloads/linux-3.0.82-openloongson# make ARCH=mips CROSS_COMPILE=mipsel-linuxmodules
CHK include/linux/version.h
CHK include/generated/utsrelease.h
CALL scripts/checksyscalls.sh
<stdin>:1554:2: warning: #warning syscall sendmmsg not implemented
Building modules, stage 2.
MODPOST 3 modules
LD [M] drivers/char/hello.ko
然后 make modules_install,把编译好的模块拷贝到系统目录下(一般是/lib/modules/);
root@ubuntu:~/Downloads/linux-3.0.82-openloongson# make ARCH=mips CROSS_COMPILE=mipsel-linux-

modules_install
INSTALL drivers/char/hello.ko
INSTALL drivers/scsi/scsi_wait_scan.ko
INSTALL drivers/usb/gadget/g_mass_storage.ko
DEPMOD 3.0.82
--------
最后生成的模块文件(.KO)就在\lib\modules\***\下;找到需要添加的模块文件,如果
是开发板的话就将此文件下载到你的开发板;最后 insmod 模块名,就可以动态加载模块。
注:在 make modules 命令之后用,即可编译内核模块。拷贝到系统目录下的目的是方
便使用。一般加载驱动使用 modprobe ***命令,该命令从系统目录下查找名为***的模块。
其实也可以不做 make modules_install,但是这样的话就需要每次手动从编译目录里运行
insmod。运行 modules_install 的另一个作用是会运行 depmod 去生成 modules.dep 文件,该
文件记录了模块之间的依赖关系。这样当运行 modprobe ***(自动处理可载入模块)的时
候就能够把***所依赖的模块一并加载。
make 写好的驱动程序之后会生成.ko 文件,此 ko 文件就是编译之后生成的模块文件,
也就是 Makefile 文件中 obj-m 缩生成的文件,然后需要将此文件加载到模块,即使用 insmod
或者 modprobe 命令将生成的模块文件(.ko 文件加载进内核),但是此时所写好的应用程序还
是不能运行,需要在/dev 下创建设备节点,手动创建设备节点的方法是:mknod 设备节点
名称 设备类型 主设备号 次设备号。例如:mknod memdev c 260 0,创建好之后会在/dev
目录下看到一个字符设备名字为 memdev 的类型。然后此时应用程序才能正常运行。
此处讲述的就是不用使用 mknod 手动创建设备节点,采用的是在源文件中添加代码使
之加载模块的时候自动创建设备节点,从而达到高效的作用。
在源程序中添加头文件#include <linux/device.h>,需要使用头文件里面的 struct class 结
构,class_create、device_create、device_destroy、class_destroy 函数,具体使用方法参见头文
件,在此不再赘述。
chr_dev_init(void)函数。可以看到,所有字符设备的初始化函数(IDE_INT_init 之类)都
要添加在这里。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|龙芯俱乐部开源技术社区

GMT+8, 2024-5-2 17:37 , Processed in 0.088875 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表