0

我需要使用TMS320DM368读取异步外部存储器接口 ( AEMIF )在自定义硬件上的嵌入式 linux 环境中。我实际上还没有硬件,所以我正在 Leopardboard 368 上测试 vala 代码(如下)。引导加载程序使用第一个 AEMIF 来读取 nand flash。我的代码正在尝试使用第二个 AEMIF 来读取不在 Leopardboard 上但将在自定义硬件上的 SRAM。我怀疑分段错误是由于我试图访问受保护的内存这一事实引起的。实际的自定义硬件将有几 M 的 SRAM 需要读取,但我试图让这个测试代码读取读取 256 个字节。如何修复由下面的测试代码引起的分段错误?我需要向内核添加驱动程序吗?如果可能的话,我宁愿不要弄乱内核。是否有嵌入式 Linux 方法来配置或声明某些地址范围不受保护?

uint8 * source = (uint8 *)0x04000000; // AEMIF Data (CE1)
uint32 * pA2CR = (uint32 *)0x01D10014; // AEMIF 2 Config Reg (CS3 space)
const uint32 READ_SETUP = 1; // Read setup: EMIF clock cycles - 1
*pA2CR = (READ_SETUP << 13);
const size_t size = 256;
var dest = new uint8[size];
memset(dest, 0, size);
memcpy(dest, source, size);
4

1 回答 1

2

我不熟悉 DM386,但我曾经在 DM6446 上工作。在 DM6446 中,但我希望在 DM368 上也一样,重新映射物理地址。

我不知道您的情况,但我认为您可以使用 miscdevice 编写驱动程序,并为您的用户空间程序提供读写操作支持。

在我的内核模块中,我使用IO_ADDRESS宏来进行重新映射和访问寄存器。给你举个例子:

#define REG_PINMUX1     (*((volatile unsigned long *) (IO_ADDRESS(PINMUX1))))

然后在代码中我有类似的命令

REG_PINMUX0 &= ~(0x01000000);

所以我认为你得到了段错误,因为你有一个错误的指针。并且尝试在没有内核模块的情况下从用户空间程序访问硬件寄存器并不是一个好的策略。

于 2012-09-13T12:45:15.640 回答