1

我有一个使用A20-OLinuXino-MICRO-4GB board的软件项目。我无法控制使用哪个板,所以关于替代品的建议没有帮助。

它有一个 Allwinner A20 双核 Cortex-A7 处理器 (armv7a)。

我尝试从 linux 进行工作,但即使具有最高优先级 PTHREAD_EXPLICIT_SCHED 和 SCHED_FIFO,我也无法阻止控制代码的时间关键部分的中断(需要每 10 微秒处理一次,但每秒大约 40 次有 40 微秒的间隙) .

有了上述限制,从 linux 访问 SPI 和 UART 的建议也无济于事。第二个线程的时间限制(整个 cpu 核心专用于它)意味着常规 linux 目前不是一个可行的替代方案。也许一个完整的实时 linux 可以完成这项工作,但我没有资源来构建它,只是想看看它是否可以工作。

目前的开发环境:

Gentoo 4.3.3-hardened-r4
crossdev --kernel =3.18 --libc =2.21-r2 --binutils =2.24-r3 --gcc =4.8.5 

构建u-boot目前不适用于 5.x 版本的 gcc,因此没有太多空间可以移动到那里。

所以转而将其编写为从 u-boot 开始的独立代码。那里没有额外的延迟,但现在我缺少配置核心其他模块的东西。当我尝试初始化和配置 SPI 或 UART 设备(除了用于 u-boot 控制台的 UART0 之外)时,所有寄存器都报告为零,并且即使在设置它们之后也保持在那里。它就像那里没有任何东西(没有硬件)一样。UART0 具有合理/预期的值,并且配置标准 GPIO 引脚(输入和输出)工作正常。配置多路复用的 GPIO 引脚以供 SPI 或 UART 使用似乎也可以工作,但模块顽固地拒绝承认它们的存在。

示例代码、Makefile 和尝试与 SPI 模块对话的输出可以在 olimex 论坛中找到。请注意,示例使用来自 u-boot 构建的包含文件。用于创建该代码的主要文档是A20 用户手册

有没有人使用过 A20、Cortex-A7、armv7a 或类似芯片,并想出如何访问 linux 之外的功能?

有人知道在哪里可以获得有关该级别编程的更好文档吗?

我的用户手册有很多关于寄存器地址、偏移量、位掩码的信息,但没有任何代码示例。我希望一个简单的独立 C(甚至汇编程序)示例,它配置任何(设备)模块,并设置一个中断来处理它,对找出其余部分非常有帮助。

实际上,我通过位敲击 I/O 引脚使 SPI 通信正常工作。这不适用于 UART,而 SPI 看起来像是一个更简单的情况,首先要处理。

我多年来一直在大型系统上编程,有些在非常小的(6502、8085、arduinio)系统上编程,但在这种环境下没有真正的开发经验。我不是内核程序员,也不是任何接近的人。

编辑:我在示例代码中添加了 SPI1 时钟设置,但在设置它们之前和之后,所有 SPI 寄存器仍然显示为全零。代码更改:

#include <asm/arch-sunxi/clock_sun4i.h>
struct sunxi_ccm_reg * clockRegister;
#define SPI_SCLK_GATING_CLKON   0x80000000
#define SPI_CLK_SRC_OSC24M      0x00000000
#define SPI_CLK_DIV_RATION_8    0x00030000
// ...
printf ("SPI1 clk cfg %08x\n", clockRegister->spi1_clk_cfg);
clockRegister->spi1_clk_cfg =
  SPI_SCLK_GATING_CLKON | SPI_CLK_SRC_OSC24M | SPI_CLK_DIV_RATION_8 | 15;
printf ("SPI1 clk cfg %08x\n", clockRegister->spi1_clk_cfg);

这表明时钟配置 DID 从 0x00000000 变为 0x8003000f

4

1 回答 1

0

我还在 基于微控制器的项目google+ 社区上发布了这个问题,Nikolai Kondrashov (spbnick) 在那里发现并正确解释了文档中的一条信息。

要访问 SPI 寄存器,必须设置 AHB_GATTING_REG0 中 SPI«n» 的门控 AHB 时钟位和 SPI«n»_CLK_REG 中的 SCLK_GATING 位。一旦这些被设置,SPI«n»模块寄存器本身就可以访问了。

可能令人困惑的旁注:首先设置 AHB 门控位,然后在设置 SCLK 门控位之前尝试引用 SPI 寄存器会导致完全冻结。由于在工作应用程序中,这些通常会设置在一起,这通常不是问题。仅显示调试输出,检查 SPI 寄存器何时可见。

我仍然发现文档相当缺乏。一些代码示例会大大改善它。这一发现可能足以访问大多数 SoC 模块/设备。

相当少的示例代码。这适用于为原始问题显示的相同 Makefile。这会引入一个额外的 u-boot 包含文件。

#include <common.h>

// Global memory pointers
uint32_t
    (*SPIarry1)[11],
    *SPI1_Cfg,
    *AHB_Gate0,
    *SPI1_ClkCfg;

int spi_test (void);

int spi_test (void)
{
    AHB_Gate0 = (uint32_t *)(SUNXI_CCM_BASE + 0x60);
    SPI1_ClkCfg = (uint32_t *)(SUNXI_CCM_BASE + 0xa4);
    SPIarry1 = (uint32_t (*)[11])SUNXI_SPI1_BASE;

    printf ("SPI1 Cfg Reg 0x%08x\n", (*SPIarry1)[2]);
    *SPI1_ClkCfg = 0x80000000;
    printf ("SPI1 Cfg Reg 0x%08x\n", (*SPIarry1)[2]);
    *AHB_Gate0 |= 0x00200000;
    printf ("SPI1 Cfg Reg 0x%08x\n", (*SPIarry1)[2]);
    return (0);
}

捕获的示例程序输出

## Starting application at 0x42000000 ...
SPI1 Cfg Reg 0x00000000
SPI1 Cfg Reg 0x00000000
SPI1 Cfg Reg 0x0012001c
## Application terminated, rc = 0x0
于 2016-04-20T22:05:14.293 回答