为了查看UART的底层驱动,但是在linux-2.6.38\drivers\tty\serials文件夹下看到很多有关串口的驱动程序,不知系统到底加载的哪个。为了弄明白这个问题,就对分析相应文件夹下的Makefile文件和kconfig文件。现记录如下,可能并不完整,在以后的学习中再补充。
在Ubuntu的终端上make
menuconfig,出现配置窗口,对内核进行裁剪,找到串口的加载选项目录,此处是把serial加载到内核。配置选项如下:
Device Drivers --->
Character
devices --->
Serial
drivers --->
Samsung S3C6400/S3C6410/S5P6440/S5P6450/S5PC100 Serial port
support
配置完成会在linux-2.6.38主目录下生成.config文件,保存配置的选项。打开.config文件,可以看到串口的选项为“YES”:
CONFIG_SERIAL_S3C6400=y
在linux-2.6.38\drivers目录下,包含了linux所有的驱动程序,他们分类存放在各自的文件夹下,也包括drivers文件夹下的Makefile和kconfig文件:
char/
mtd/
tty/
…
Makefile
Kconfig
在Kconfig文件夹下有如下内容,脚本中的
source 意味着引用新的 Kconfig 文件。但是没有发现source
"drivers/tty/Kconfig",这是因为serial
driver在
drivers/char/Kconfig中被声明,目录Serial
drivers被安排到Character
devices目录下。
menu
"Device Drivers"
source
"drivers/base/Kconfig"
source
"drivers/char/Kconfig"
source
"drivers/mtd/Kconfig"
…
endmenu
menu与endmenu是一组指令,menu的作用,可以理解成一个目录,menu可以把其中一部分配置项包含到一个menu中,这样有利于配置的分类显示。
在linux-2.6.38\drivers \char目录下Kconfig文件:
menu
"Character devices"
source
"drivers/tty/serial/Kconfig"
…
endmenu
在linux-2.6.38\drivers\tty\目录下
Makefile文件:
obj-y
+= serial/
//表示包括在该serial文件下生成的目标文件
obj-y
+= tty_io.o //表示此目录下有目标文件tty_io.o,其从tty_io.c或tty_io.S编译得到
在linux-2.6.38\drivers\tty\serial文件夹下串口驱动程序文件:s3c6410.c
Makefile文件:
obj-$(CONFIG_SERIAL_S3C6400) +=
s3c6400.o
Kconfig文件:
config SERIAL_S3C6400
tristate "Samsung S3C6400/S3C6410/S5P6440/S5P6450/S5PC100 Serial
port support"
depends on SERIAL_SAMSUNG && (CPU_S3C6400 || CPU_S3C6410 ||
CPU_S5P6440 || CPU_S5P6450 || CPU_S5PC100)
select SERIAL_SAMSUNG_UARTS_4
default y
help
Serial port support for the Samsung S3C6400,
S3C6410, S5P6440, S5P6450
and S5PC100 SoCs
config
SERIAL_SAMSUNG_UARTS_4
bool
depends on ARM && PLAT_SAMSUNG
default y if CPU_S3C2443
help
Internal node for the common case of 4 Samsung
compatible UARTs
config SERIAL_SAMSUNG
tristate "Samsung SoC serial support"
depends on ARM && PLAT_SAMSUNG
select SERIAL_CORE
help
Support for the on-chip UARTs on the Samsung
S3C24XX series CPUs,
providing /dev/ttySAC0, 1 and 2 (note, some
machines may not
provide all of these ports, depending on how the
serial port
pins are configured.
tristate的意思是“三态”,可以是Y内建、N移除、M模块。
depends
on是依赖关系,f1中有depend
on f2,只有f2成立时,f1才成立。
select是反依赖关系,f1中有depend
on f2,f1成立了,f2也同时成立。
在linux-2.6.38\arch\arm\mach-s3c64xx目录中:
在s3c6410.c文件:
s3c6410_init()
s3c6410_core_init()
s3c6410_init_irq()
s3c6410_init_clocks()
在Makefile文件:
#
Core support for S3C6410 system
obj-$(CONFIG_CPU_S3C6410) += s3c6410.o
在Kconfig文件:
config CPU_S3C6410
bool
help
Enable S3C6410 CPU support