Visible to Intel only — GUID: iga1447435461021
Ixiasoft
Visible to Intel only — GUID: iga1447435461021
Ixiasoft
4.2.3.4.2. Accessing Peripherals
If your application accesses peripheral registers, or performs only a small set of memory accesses, Intel recommends that you use the default HAL I/O macros, IORD and IOWR. These macros guarantee that the accesses bypass the data cache.
Two types of cache-bypass macros are available. The HAL access routines whose names end in _32DIRECT, _16 DIRECT, and _8 DIRECT interpret the offset as a byte address. The other routines treat this offset as a count to be multiplied by four bytes, the number of bytes in the 32-bit connection between the Nios® II processor and the system interconnect fabric. The _32DIRECT, _16DIRECT, and _8DIRECT routines are designed to access memory regions, and the other routines are designed to access peripheral registers.
The example below shows how to write a series of half-word values into memory. Because the target addresses are not all on a 32-bit boundary, this code sample uses the IOWR_16DIRECT macro.
Writing Half-Word Locations
/* Loop across 100 memory locations, writing 0xdead to */ /* every half word location... */ for(i=0, j=0;i<100;i++, j+=2) { IOWR_16DIRECT(MEM_START, j, (unsigned short)0xdead); }
The example below shows how to access a peripheral register. In this case, the write is to a 32-bit boundary address, and the code sample uses the IOWR macro.
Peripheral Register Access
unsigned int control_reg_val = 0; /* Read current control register value */ control_reg_val = IORD(BAR_BASE_ADDR, CONTROL_REG); /* Enable "start" bit */ control_reg_val |= 0x01; /* Write "start" bit to control register to start peripheral */ IOWR(BAR_BASE_ADDR, CONTROL_REG, control_reg_val);