工具/软件: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>; /*Ranges =<0 0x08000000 0x1000000>; CS0:16MB、用于 NAND */ #address-cells =<2>; 大小单元格=<1>; 范围=<0 0x01000000 0x1000000>; /*范围;*/ };
。
。
。
这些寄存器设置通过 helloworld ARM 应用程序工作。
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