我有一个软件项目要使用A20-OLinuXino-MICRO-4GB board。我无法控制要使用哪一块板,所以对候补板的建议没有帮助。
它有一个全优胜者A20双核Cortex-A7处理器(armv7a)。
我试着从Linux中做这项工作,但是即使有最大优先级,pthRead StutixSysHED和SedEdFIFO,我也不能阻止一个时间关键的控制代码段的中断(需要每10微秒处理一次,但是每秒大约有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
Buildingu-boot目前不适用于5.x版本的gcc,因此没有太大的空间移动到那里。
因此,转向了以独立代码的形式编写从u-boot开始的代码。没有额外的延迟,但是现在我缺少了一些配置核心的其他模块的东西。当我尝试初始化和配置SPI或UART设备(除了用于u-boot控制台的UART0)时,所有寄存器都报告为零,并且即使在设置它们之后也保持在那里。它的作用就好像那里什么都没有(没有硬件)。UART0具有合理/预期的值,并且配置标准GPIO管脚(输入和输出)工作正常。配置SPI或UART所使用的多路复用GPIO引脚似乎也起作用,但模块顽固地拒绝承认它们的存在。
尝试与SPI模块对话的示例代码、Makefile和输出可以找到in the olimex forum。
请注意,示例使用来自u-boot构建的include文件
用于创建该代码的主要文档是A20 User Manual。
有没有人使用过A20、Cortex-A7、armv7a或类似的芯片,并想出了如何访问linux之外的功能?
有人知道在哪里可以得到关于那个级别编程的更好的文档吗?
我的用户手册中有很多关于寄存器地址、偏移量、位掩码的信息,但是没有代码示例方面的信息。我希望一个简单的独立C(甚至是汇编程序)示例,它配置了任何(设备)模块,并设置了一个中断来处理它,这将有助于解决其余问题。
实际上,我是通过敲打I/O引脚来实现SPI通信的。这对UART不起作用,SPI看起来是一个更简单的情况。
我已经在大型系统上编程很多年了,有些在非常小的(65028085,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);
这表明时钟配置确实从0x00000000更改为0x8003000f
最佳答案
我也把这个问题贴在
Microcontroller Based Projectsgoogle+社区和Nikolai Kondrashov(spbnick)发现并正确解释了文档中的一段信息。
要访问SPI寄存器,必须设置AHB GATTING REG0中SPI~“n”位的选通AHB时钟和SPI~“n”CLK~“u CLK”寄存器中的SCLK~“n”选通位。一旦这些设置完成,SPI«n»模块寄存器本身就可以访问。
可能令人困惑的另一方面:首先设置AHB选通位,然后在设置SCLK选通位之前尝试引用SPI寄存器会导致完全冻结。因为在工作应用程序中,这些通常会一起设置,这通常不是问题。只显示调试输出,检查SPI寄存器何时可见。
我仍然觉得文件相当缺乏。一些代码示例将大大改进它。这个发现可能足以访问大多数SoC模块/设备。
相当少的示例代码这与为原始问题显示的Makefile相同。它会拉入一个附加的u-boot include文件。
#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
关于c - 在Linux外部为Cortex-A7启用SPI Controller ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36658201/