我有一个使用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