本文目的在虚拟平台总线上注册字符设备hello_device。通过命令 ls /sys/devices/platform/可以查到 hello_device。进行以下步骤操作。
一、使能平台设备文件
1、iTOP-4412 设备注册在iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c
2、要使mach-itop4412.c编译进内核,进行以下步骤。
3、make menuconfig
进入文件 iTop4412_Kernel_3.0/Kconfig,内容如下
#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
mainmenu "Linux/$ARCH $KERNELVERSION [$SRCARCH] Kernel Configuration"
config SRCARCH
string
option env="SRCARCH"
source "arch/$SRCARCH/Kconfig"
从上面的语句 跳转到这个文件arch/arm/Kconfig,部分内容如下。
menu "System Type"
..........
..........
choice
prompt "ARM system type"
default ARCH_VERSATILE
..........
..........
config ARCH_EXYNOS
bool "Samsung EXYNOS"
select CPU_V7
select ARCH_SPARSEMEM_ENABLE
select GENERIC_GPIO
select HAVE_CLK
select CLKDEV_LOOKUP
select ARCH_HAS_CPUFREQ
select GENERIC_CLOCKEVENTS
select HAVE_S3C_RTC if RTC_CLASS
select HAVE_S3C2410_I2C if I2C
select HAVE_S3C2410_WATCHDOG if WATCHDOG
select ARCH_HAS_OPP
select PM_OPP if PM
help
Samsung EXYNOS series based systems
..........
..........
endchoice
..........
..........
endmenu
source "arch/arm/mach-exynos/Kconfig"
界面如下:
4、选择系统类型,enter 进入菜单 menu "System Type"
5、选择arm平台,enter进入"ARM system type"
6、选择samsung EXYNOS平台。select保存退出,回到上级目录。
在.config 目录中就会出现 这个配置 CONFIG_ARCH_EXYNOS=y,根据/arch/arm/Makefile中的语句
machine-$(CONFIG_ARCH_EXYNOS) := exynos
这样mach-exynos目录就会被编译。
7、根据source "arch/arm/mach-exynos/Kconfig" ,进入mach-exynos目录的Kconfig,部分内容如下。
menu "EXYNOS4 Machines"
depends on ARCH_EXYNOS4
..........
..........
config MACH_SMDK4X12
bool "SMDK4X12 board"
select CPU_EXYNOS4212
select CPU_EXYNOS4412
..........
help
Machine support for Samsung SMDK4X12
endmenu
界面操作如下。
8、enter 键进入"EXYNOS4 Machines"
9、选择 “SMDK4X12 board”,最后保存配置。
10、在.config文件中会有这个变量 CONFIG_MACH_SMDK4X12=y。
11、在arch/arm/mach-exynos/Makefile中,有如下语句。当CONFIG_MACH_SMDK4X12=y,平台设备文件mach-itop4412.c
将会被编译。
obj-$(CONFIG_MACH_SMDK4X12) += mach-itop4412.o
到这里我们平台文件mach-itop4412.c被编译配置条件完成。
二、在.config 文件中定义这样一个变量CONFIG_HELLO_CTL=y,进行以下操.
CONFIG_HELLO_CTL 这个变量主要的作用就是可以通过make menuconfig菜单进行可选择的把hello_device设备编译进入内核或者不编译进内核。
1、在文件iTop4412_Kernel_3.0/drivers/char/Kconfig,添加内容。
config HELLO_CTL
bool "Enable HELLO config"
default y
help
Enable HELLO config
2、make menuconfig 操作步骤
enter 进入Device Drivers
enter 进入character device
Enable_HELLO_config,这个就是我们新添加的,默认是被选择的,保存退出。
在.config 出现变量Enable_HELLO_config
.......
CONFIG_LEDS_CTL=y
CONFIG_HELLO_CTL=y
CONFIG_BUZZER_CTL=y
.......
如果不选择Enable_HELLO_config,在在.config中将出现如下结果
...........
CONFIG_LEDS_CTL=y
# CONFIG_HELLO_CTL is not set
CONFIG_BUZZER_CTL=y
.........
它会被注释掉。
到这里我们的变量CONFIG_HELLO_CTL 被添加完成。
三、在mach-itop4412.c中注册设备hello_device
1、在mach-itop4412.c中添加内容
#ifdef CONFIG_LEDS_CTL
struct platform_device s3c_device_leds_ctl = {
.name = "leds",
.id = -1,
};
#endif
#ifdef CONFIG_HELLO_CTL
struct platform_device s3c_device_hello_ctl = {
.name = "hello_device",
.id = -1,
};
#endif
2、static struct platform_device *smdk4x12_devices[],在这个结构体数组中添加下面内容
......
#ifdef CONFIG_LEDS_CTL
&s3c_device_leds_ctl,
#endif
#ifdef CONFIG_HELLO_CTL
&s3c_device_hello_ctl,
#endif
.......
四、编译
make zImage
五、下载zImage
zImage 在目录iTop4412_Kernel_3.0/arch/arm/boot里。
六、结果
[root@iTOP-4412]# ls /sys/devices/platform/
adc_ctl s3c-pl330.1 s5pv210-uart.3
alarm s3c-pl330.2 samsung-audio
android_pmem.0 s3c-sdhci.2 samsung-audio-idma
android_pmem.1 s3c-sdhci.3 samsung-i2s.0
arm-pmu.0 s3c-usbgadget samsung-i2s.4
bt-sysfs s3c2410-wdt samsung-keypad
buzzer_ctl s3c2440-i2c.1 samsung-kmsg
dw_mmc s3c2440-i2c.3 samsung-pd.0
exynos-busfreq s3c2440-i2c.4 samsung-pd.1
exynos-usb-switch s3c2440-i2c.5 samsung-pd.2
exynos4412-adc s3c2440-i2c.7 samsung-pd.5
gpio-keys s3c24xx-pwm.1 samsung-pd.6
hello_device s3c64xx-rtc samsung-pd.7
i2c-gpio.0 s3c64xx-spi.2 samsung-rp
ion-exynos s5p-ehci serial8250
leds s5p-fimg2d si_gps
max485_ctl s5p-pmic snd-soc-dummy
mt3326-gps s5p-sysmmu.15 soc-audio
power s5p-tvout-cec switch-gpio.0
power.0 s5p-tvout-hpd tc4-regulator-consumer
reg-dummy s5pv210-uart.0 uevent
regulatory.0 s5pv210-uart.1 wlan_ar6000_pm_dev.1
relay_ctl s5pv210-uart.2
设备hello_device注册成功。