63 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef __MMIO_H__
 | 
						|
#define __MMIO_H__
 | 
						|
 | 
						|
#define REG16(x)(*((volatile uint16_t *)(x)))
 | 
						|
#define REG(x)(*((volatile uint32_t *)(x)))
 | 
						|
#define BIT(x)(0x1 << x)
 | 
						|
 | 
						|
/* Write a uint32_t value to a memory address. */
 | 
						|
static inline void
 | 
						|
write32(uint32_t address, uint32_t value)
 | 
						|
{
 | 
						|
	REG(address) = value;
 | 
						|
}
 | 
						|
 | 
						|
/* Read an uint32_t from a memory address */
 | 
						|
static inline uint32_t
 | 
						|
read32(uint32_t address)
 | 
						|
{
 | 
						|
	return REG(address);
 | 
						|
}
 | 
						|
 | 
						|
/* Set a 32 bits value depending on a mask */
 | 
						|
static inline void
 | 
						|
set32(uint32_t address, uint32_t mask, uint32_t value)
 | 
						|
{
 | 
						|
	uint32_t val;
 | 
						|
	val = read32(address);
 | 
						|
	/* clear the bits */
 | 
						|
	val &= ~(mask);
 | 
						|
	/* apply the value using the mask */
 | 
						|
	val |= (value & mask);
 | 
						|
	write32(address, val);
 | 
						|
}
 | 
						|
 | 
						|
/* Write a uint16_t value to a memory address. */
 | 
						|
static inline void
 | 
						|
write16(uint32_t address, uint16_t value)
 | 
						|
{
 | 
						|
	REG16(address) = value;
 | 
						|
}
 | 
						|
 | 
						|
/* Read an uint16_t from a memory address */
 | 
						|
static inline uint16_t
 | 
						|
read16(uint32_t address)
 | 
						|
{
 | 
						|
	return REG16(address);
 | 
						|
}
 | 
						|
 | 
						|
/* Set a 16 bits value depending on a mask */
 | 
						|
static inline void
 | 
						|
set16(uint32_t address, uint16_t mask, uint16_t value)
 | 
						|
{
 | 
						|
	uint16_t val;
 | 
						|
	val = read16(address);
 | 
						|
	/* clear the bits */
 | 
						|
	val &= ~(mask);
 | 
						|
	/* apply the value using the mask */
 | 
						|
	val |= (value & mask);
 | 
						|
	write16(address, val);
 | 
						|
}
 | 
						|
 | 
						|
#endif /* __MMIO_H__ */
 |