杂七杂八的

ARM 64浏览

内存映射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

这两个是对应的。