This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

求个am335x 上FPGA的用户态读写 接口实现范例



AM335X + SDK06.00.00.00
要求的话 就是用户可以用命令实时读写cpu的各个寄存器
我写了个一直没成功
这样的接口ti是可以,也应该有的吧,
谢谢~!

  • 抱歉 题目修正下:求个am335x 上各个寄存器的用户态接口实现范例

    谢谢~!

  • 看看这段代码可有用

    #include <stdint.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <sys/mman.h>
    #include <unistd.h>

    #define GPMC_BASE 0x50000000

    #define GPMC_CHIPSELECTCONFIGDISPLACEMENT (0x30 / 4)

    #define GPMC_CONFIG1 (0x60 / 4)
    #define GPMC_CONFIG2 (0x64 / 4)
    #define GPMC_CONFIG3 (0x68 / 4)
    #define GPMC_CONFIG4 (0x6c / 4)
    #define GPMC_CONFIG5 (0x70 / 4)
    #define GPMC_CONFIG6 (0x74 / 4)
    #define GPMC_CONFIG7 (0x78 / 4)

    static int devmemfd = -1;

    //map memory of length "len" at offset "offset"
    static void* util_mapmemoryblock(off_t offset, size_t len)
    {
    devmemfd = open("/dev/mem", O_RDWR | O_SYNC);
    void* registers = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, devmemfd, offset);
    if (registers == MAP_FAILED) {
    printf("Map failed\n");
    }
    return registers;
    }

    static void util_unmapmemoryblock(void* block, size_t len)
    {
    munmap((void*) block, len);
    if (devmemfd != -1) {
    close(devmemfd);
    }
    }

    #define REGLEN 0x10000000

    static volatile uint32_t* registers = NULL;

    static void gpmc_mapregisters()
    {
    registers = (uint32_t*) util_mapmemoryblock(GPMC_BASE, REGLEN);
    }

    static void gpmc_unmapregisters()
    {
    util_unmapmemoryblock((void*) registers, REGLEN);
    }

    static void gpmc_setup(void)
    {
    gpmc_mapregisters();

    if (registers != MAP_FAILED) {
    int chipselect = 0;
    int displacement = GPMC_CHIPSELECTCONFIGDISPLACEMENT * chipselect;

    // disable before playing with the registers..
    *(registers + displacement + GPMC_CONFIG7) = 0x00000000;

    *(registers + displacement + GPMC_CONFIG1) = 0x00000000; //No burst, async, 8-bit, non multiplexed
    *(registers + displacement + GPMC_CONFIG2) = 0x00000300; //Assert CS on fclk 0, deassert CS on fclk 3
    *(registers + displacement + GPMC_CONFIG3) = 0x00000000; //Unused ADV/ALE
    *(registers + displacement + GPMC_CONFIG4) = 0x00000301; //Assert OE on fclk 1, deassert OE on fclk 3
    *(registers + displacement + GPMC_CONFIG5) = 0x00020003; //Data valid on fclk 2, cycle time 3 fclks
    *(registers + displacement + GPMC_CONFIG6) = 0x00000000; //No back to back cycle restrictions
    *(registers + displacement + GPMC_CONFIG7) = 0x00000f41; //CS0: Set base address 0x01000000, 16MB region, and enable CS

    gpmc_unmapregisters();
    }
    }

    static volatile uint8_t* extbus;

    void bus_init()
    {
    gpmc_setup();

    extbus = (uint8_t*) util_mapmemoryblock(0x01000000, 0x100);
    }

    void bus_writebyte(uint8_t address, uint8_t data)
    {
    *(extbus + address) = data;
    }

    uint8_t bus_readbyte(uint8_t address)
    {
    return *(extbus + address);
    }

    void bus_shutdown()
    {
    util_unmapmemoryblock((void*) extbus, 0x100);
    }

    int main() {
    bus_init();
    for (int i = 0; i < 10; i++) {
    printf("byte at address %x: %X\n", i, bus_readbyte(i));
    }
    bus_shutdown();
    }

  • 已经找到了

    不过还是非常感谢 leo chen,望以后还能得到您的指点

    谢谢!