内存映射MemoryMap
飞思的BSP已经实现了一个预定义的物理地址到虚拟地址映射表,
在arch/arm/mach-mx5/mm.c中实现了。
一些关键的宏定义在arch/arm/plat-mxc/include/mach/hardware.h中定义用于物理地址、虚拟地址的基地址或物理地址到虚拟地址的映射宏。
一、IOMUX
IOMUXC软件实现部分提供了API直接对寄存器进行操作。
IOMUXC实现的代码在下列的文件中:
Arch/arm/plat-mxc/iomux-v3.c IOMUXC函数实现,在基地址+控制寄存器常量,进行读写
Arch/arm/plat-mxc/include/mach/iomux-mx53.h 定义了各个PAD的模式常量,可以直接使用
Arch/arm/plat-mxc/include/mach/iomux-v3.h IOMUXC API说明文件,设置基地址,设置/获取PAD值(单一或群组)
使用freescalebsp提供的API可以直接对IOMUX进行操作。所以必须要先看上面的3个文件!!!!必须要看懂!!!
二、GPIO
由于GPIO支持中断,所以预定义的中断号以 NR_IRQS形式给出来了。
可以使用宏IOMUX_TO_IRQ_V3()或gpio_to_irq()将GPIO引脚转换成IRQ号。
设置一个IOMUX引脚,使用mxc_iomux_v3_setup_pad()。
如果引脚被用做GPIO,则就要使用gpio_request()和gpio_free()函数。用户应该检测返回值以防止被占用。
Gpio_direction_input()用于设置GPIO为输入
Gpio_direction_output()用于设置GPIO为输出
GPIO的实现部分提供了以下的支持:1、访问硬件GPIO模块;2、控制GPIO方向和中断
Arch/arm/plat-mxc/include/mach/gpio.h 头文件定义
Arch/arm/plat-mxc/include/mach/gpio.c 函数实现及GPIO寄存器定义
这两个文件一定要看!!!这样就会使用freescale bsp提供的API直接访问GPIO了。
1. arch/arm/plat-mxc/include/mach/Mx5x.h
定义了寄存器的物理地址,中断号等
2. arch/arm/mach-mx5/Devices.c
定义了平台设备资源结构体,平台设备结构体
3. arch/arm/plat-mxc/Gpio.c
arch/arm/plat-mxc/Gpio.h
定义了一些操作GPIO寄存器的函数和宏
在arch/arm/mach-mx5/mx53_smd.c中调用mxc_register_device()注册了各种片上设备,这个函数本质上是调用了platform_device_register(),以平台设备的方式展现出来了。这个可以通过/sys/bus/platform/devices目录中看出来。如下:
/sys/bus/platform/devices# ls
FlexCAN.0 imx-3stack-sgtl5000.0 mxc_ssi.1
WLED-1 imx-i2c.0 mxc_v4l2_capture.0
WLED-2 imx-i2c.1 mxc_v4l2_output.0
WLED-3 imx-i2c.2 mxc_vpu.0
ahci.0 imx-spdif-audio-device.0 mxc_wdt.0
android_pmem.0 mxc_asrc.0 mxcintuart.0
android_pmem.1 mxc_bt_rfkill.0 mxcintuart.1
android_usb mxc_ddc.0 mxcintuart.2
busfreq.0 mxc_dvfs_core.0 mxcintuart.3
da9052-adc mxc_gpu.0 mxcintuart.4
da9052-bat mxc_iim.0 mxsdhci.0
da9052-leds mxc_ipu mxsdhci.1
da9052-onkey mxc_ldb mxsdhci.2
da9052-regulator mxc_pwm.1 ptp.0
da9052-rtc mxc_rtc.0 pwm-backlight.0
da9052-tsi mxc_scc.0 reg-fixed-voltage.0
da9052-wdt mxc_sdc_fb.0 rndis
fec.0 mxc_sdc_fb.1 soc-audio
fsl-ehci.0 mxc_sdc_fb.2 soc-audio.2
fsl-ehci.1 mxc_sdma tve.0
fsl-usb2-otg mxc_spdif.0 usb_mass_storage
fsl-usb2-udc mxc_spi.0 usb_wakeup.0
gpio-keys mxc_ssi.0 usb_wakeup.1
/sys/bus/platform/devices#
上面列出来的设备都是通过platform_device_register()注册的。
既然平台设备有了,下一步就是再找一下相应的平台驱动。
在drivers/spi/Mxc_spi.c中实现了spi平台驱动程序platform_device mxc_spi_driver;
由于平台驱动也是通过platform_driver_register()注册的,所以在sysfs文件系统中也能找到。在/sys/bus/platform/drivers/目录下。
/sys/bus/platform/drivers# ls
FlexCAN mc34708_adc mxc_ssi
arm-pmu mx51_lpmode mxc_v4l2_output
busfreq mx5_pm mxc_vpu
da9052-adc mxc-pxp mxc_wdt
da9052-onkey mxc_asrc mxcintuart
da9052-regulator mxc_dvfs_core mxcpwrkey
da9052-tsi mxc_dvfsper mxs_viim
fec mxc_epdc_fb mxsdhci
fsl-ehci mxc_esai pmic_leds
fsl-usb2-otg mxc_gpu pmic_light
fsl-usb2-udc mxc_i2c_hs pmic_rtc
generic-bl mxc_iim ptp
gpio-keys mxc_ipu pwm-backlight
imx-3stack-sgtl5000 mxc_keypad pxp-device
imx-i2c mxc_ldb reg-fixed-voltage
imx-spdif-audio-device mxc_mc13892_bl sdram_autogating
lcd_spi mxc_nandv2_flash smsc911x
ltc3589-regulator mxc_pwm soc-audio
max17135-reg mxc_rtc spi_imx
max17135_sensor mxc_sdc_fb tve
mc13892-regulatr mxc_sdma usb_wakeup
mc13892_adc mxc_spdif
mc34708-regulatr mxc_spi
/sys/bus/platform/drivers#
从上面可以看到mxc_spi驱动程序。
为了验证一下,把我写的led驱动程序动态加载到内核中。
加载平台设备模块 insmod led_device.ko
加载平台驱动模块 insmod led_driver.ko
这样
在/sys/bus/platform/devices目录下就有了imx5_led.0
在/sys/bus/platform/drivers目录下就有了imx5_led
这两个是对应的。