工具/软件:Linux
我有一个有效的裸机 ARM A15代码、该代码将 GPMC 配置为 AM5728 IDK、以便与存储器地址0x01000000处的 Altera FGPA Cyclone5进行通信。
(使用 CS0 16位、异步、非多路复用地址和数据线路)-寄存器设置在末尾。
现在、我正在尝试从 Linux 配置 GPMC 寄存器。 但是、在尝试更改 DTS 文件后、我无法让 Linux 显示 GPMC 寄存器映射。
我使用的是具有 RT 内核4.4.3.2的最新处理器 SDK3.2、
我在启动时遇到以下 GPMC 探测器错误:
OMAP-GPMC 50000000。GPMC:找不到节点/pinmux_gpMC_pins 的 pctldev、延迟探针
我有几个问题
1.如何从 Linux 配置 GPMC 寄存器? 这应该在哪里进行? 在 Uboot、dtb 文件还是内核中?
2、如何映射 FPGA 的存储器地址0x01000000? 我是否需要保留 CMA 或 cmem 地址范围?
3.我需要编写内核模块还是可以使用 userspace 中的 mmap?
4.如果使用设备树设置,范围和寄存器值是多少?
我是否需要为 CS0添加子节点... GPMC 寄存器时序或地址映射?
我已向 AM572x-idk.dts 器件树文件中添加了以下内容、但这似乎不起作用。
我缺少什么?
/{
GPMC_PINS:pinmux_GPMC_PINS{
pinctrl-single、pins =<
0xB4 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_cs0.cs0 0x4A00 34B4 *
0xC0 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_clk.clk 0x4A00 34C0 *
0xc4 (PIN_INPUT_PULLUP | MUX_MODE0)/* GPMC_advn_ALe.GPIO2_23、不用于 GPMC、 用作测试的 GP 输入*/
0xC8 (PIN_OUTPUT PULLUP | MUX_MODE0)/* GPMC_oen_ren。oen_ren *
0xCC (PIN_OUTPLUG_PULLUP | MUX_MODE0)/* GPMC_WN.Wen*/
0xD0 (PIN_OUTPUT 上拉| MUX_MODE0)/* gpmc_ben0.ben0 0x4A00 34D0 */
0xD4 (PIN_OUTPUT 上拉| MUX_MODE0)/* gpmc_ben1.ben1 *
/* 0xD8 (PIN_INPUT_PULLUP | MUX_MODE14) GPMC_wait0.wait0 */
0x00 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad0.ad0 0x4A00 3400*/
0x04 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad1.ad1 */
0x08 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad2.ad2 */
0x0C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad3.ad3 */
0x10 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_AD4.AD4 0x4A00 3410*/
0x14 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad5.ad5 */
0x18 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_AD6.AD6 */
0x1C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_AD7.AD7 */
0x20 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_AD8.ad8 0x4A00 3420*/
0x24 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad9.ad9 */
0x28 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad10.ad10 */
0x2C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad11.ad11 */
0x30 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_AD12.ad12 0x4A00 3430*/
0x34 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad13.ad13 *
0x38 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad14.ad14 */
0x3C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_ad15.ad15 */
0x40 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_a0.a0 0x4A00 3440 A0不用于16位*/
0x44 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A1.A1 */
0x48 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A2.A2 */
0x4C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A3.A3 */
0x50 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A4.A4 0x4A00 3450*/
0x54 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A5.A5 */
0x58 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A6.A6 */
0x5C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A7.A7 */
0x60 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A8.A8 0x4A00 3460*/
0x64 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A9.A9 *
0x68 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A10.A10 */
0x6C (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A11.A11 */
0x70 (PIN_OUTPUT 上拉| MUX_MODE0)/* GPMC_A12.A12 0x4A00 3470*/
>;
};
};
GPMC{
状态="正常";
pinctrl-names ="default";
pinctrl-0 =<&GPMC_PINs>;
REG =<0x50000000 0x1000000>;
/*范围=<0 0x08000000 0x1000000>; CS0:16MB、用于 NAND *
#address-cells =<2>;
大小单元格=<1>;
范围=<0 0x01000000 0x1000000>;
/*范围;*/
};
。
。
。
这些寄存器设置通过 helloworld ARM 应用程序工作。
FPGA_INIT
WR_MEM_32 (0x4A0034B4、0x01000000);//CTRL_CORE_PAD_GPMC_CS0启用 cs0 WR_MEM_32 (0x50000060、0x01801003);//GPMC_CONFIG1_I_0异步 GPMC 3 = clk div 4 WR_MEM_32 (0x50000078、0x00000F41);//GPMC_CONFIG7_I_0映射到01000000 WR_MEM_32 (0x4A0034C0、0x01060000);//CTRL_CORE_PAD_GPMC_CLK WR_MEM_32 (0x4A0034C8、0x01000000);//CTRL_CORE_PAD_GPMC_OEn WR_MEM_32 (0x4A0034CC、0x01000000);//CTRL_CORE_PAD_GPMC_WEN WR_MEM_32 (0x4A003400、0x01040000);//CTRL_CORE_PAD_GPMC_AD0 WR_MEM_32 (0x4A003404、0x01040000);//CTRL_CORE_PAD_GPMC_AD1 WR_MEM_32 (0x4A003408、0x01040000);//CTRL_CORE_PAD_GPMC_AD2 WR_MEM_32 (0x4A00340C、0x01040000);//CTRL_CORE_PAD_GPMC_AD3 WR_MEM_32 (0x4A003410、0x01040000);//CTRL_CORE_PAD_GPMC_AD4 WR_MEM_32 (0x4A003414、0x01040000);//CTRL_CORE_PAD_GPMC_AD5 WR_MEM_32 (0x4A003418、0x01040000);//CTRL_CORE_PAD_GPMC_AD6 WR_MEM_32 (0x4A00341C、0x01040000);//CTRL_CORE_PAD_GPMC_AD7 WR_MEM_32 (0x4A003420、0x01040000);//CTRL_CORE_PAD_GPMC_AD8 WR_MEM_32 (0x4A003424、0x01040000);//CTRL_CORE_PAD_GPMC_AD9 WR_MEM_32 (0x4A003428、0x01040000);//CTRL_CORE_PAD_GPMC_AD10 WR_MEM_32 (0x4A00342C、0x01040000);//CTRL_CORE_PAD_GPMC_AD11 WR_MEM_32 (0x4A003430、0x01040000);//CTRL_CORE_PAD_GPMC_AD12 WR_MEM_32 (0x4A003434、0x01040000);//CTRL_CORE_PAD_GPMC_AD13 WR_MEM_32 (0x4A003438、0x01040000);//CTRL_CORE_PAD_GPMC_AD14 WR_MEM_32 (0x4A00343C、0x01040000);//CTRL_CORE_PAD_GPMC_AD15 WR_MEM_32 (0x4A003440、0x01000000);//CTRL_CORE_PAD_GPMC_A0 WR_MEM_32 (0x4A003444、0x01000000);//CTRL_CORE_PAD_GPMC_A1 WR_MEM_32 (0x4A003448、0x01000000);//CTRL_CORE_PAD_GPMC_A2 WR_MEM_32 (0x4A00344C、0x01000000);//CTRL_CORE_PAD_GPMC_A3 WR_MEM_32 (0x4A003450、0x01000000);//CTRL_CORE_PAD_GPMC_A4 WR_MEM_32 (0x4A003454、0x01000000);//CTRL_CORE_PAD_GPMC_A5 WR_MEM_32 (0x4A003458、0x01000000);//CTRL_CORE_PAD_GPMC_A6 WR_MEM_32 (0x4A00345C、0x01000000);//CTRL_CORE_PAD_GPMC_A7 WR_MEM_32 (0x4A003460、0x01000000);//CTRL_CORE_PAD_GPMC_A8 WR_MEM_32 (0x4A003464、0x01000000);//CTRL_CORE_PAD_GPMC_A9 WR_MEM_32 (0x4A003468、0x01000000);//CTRL_CORE_PAD_GPMC_A10 WR_MEM_32 (0x4A00346C、0x01000000);//CTRL_CORE_PAD_GPMC_A11 WR_MEM_32 (0x4A003470、0x01000000);//CTRL_CORE_PAD_GPMC_A12