diff --git a/include/libopencm3/stm32/f4/ltdc.h b/include/libopencm3/stm32/f4/ltdc.h index a35e2133..542279f7 100644 --- a/include/libopencm3/stm32/f4/ltdc.h +++ b/include/libopencm3/stm32/f4/ltdc.h @@ -44,18 +44,18 @@ #define LTDC_CPSR (MMIO32(LTDC_BASE + 0x44)) #define LTDC_CDSR (MMIO32(LTDC_BASE + 0x48)) /* x == LTDC_LAYER_x */ -#define LTDC_LxCR(x) (MMIO32(LTDC_BASE + 0x84+0x80*(x-1))) -#define LTDC_LxWHPCR(x) (MMIO32(LTDC_BASE + 0x88+0x80*(x-1))) -#define LTDC_LxWVPCR(x) (MMIO32(LTDC_BASE + 0x8C+0x80*(x-1))) -#define LTDC_LxCKCR(x) (MMIO32(LTDC_BASE + 0x90+0x80*(x-1))) -#define LTDC_LxPFCR(x) (MMIO32(LTDC_BASE + 0x94+0x80*(x-1))) -#define LTDC_LxCACR(x) (MMIO32(LTDC_BASE + 0x98+0x80*(x-1))) -#define LTDC_LxDCCR(x) (MMIO32(LTDC_BASE + 0x9C+0x80*(x-1))) -#define LTDC_LxBFCR(x) (MMIO32(LTDC_BASE + 0xA0+0x80*(x-1))) -#define LTDC_LxCFBAR(x) (MMIO32(LTDC_BASE + 0xAC+0x80*(x-1))) -#define LTDC_LxCFBLR(x) (MMIO32(LTDC_BASE + 0xB0+0x80*(x-1))) -#define LTDC_LxCFBLNR(x) (MMIO32(LTDC_BASE + 0xB4+0x80*(x-1))) -#define LTDC_LxCLUTWR(x) (MMIO32(LTDC_BASE + 0xC4+0x80*(x-1))) +#define LTDC_LxCR(x) (MMIO32(LTDC_BASE + 0x84 + 0x80 * (x - 1))) +#define LTDC_LxWHPCR(x) (MMIO32(LTDC_BASE + 0x88 + 0x80 * (x - 1))) +#define LTDC_LxWVPCR(x) (MMIO32(LTDC_BASE + 0x8C + 0x80 * (x - 1))) +#define LTDC_LxCKCR(x) (MMIO32(LTDC_BASE + 0x90 + 0x80 * (x - 1))) +#define LTDC_LxPFCR(x) (MMIO32(LTDC_BASE + 0x94 + 0x80 * (x - 1))) +#define LTDC_LxCACR(x) (MMIO32(LTDC_BASE + 0x98 + 0x80 * (x - 1))) +#define LTDC_LxDCCR(x) (MMIO32(LTDC_BASE + 0x9C + 0x80 * (x - 1))) +#define LTDC_LxBFCR(x) (MMIO32(LTDC_BASE + 0xA0 + 0x80 * (x - 1))) +#define LTDC_LxCFBAR(x) (MMIO32(LTDC_BASE + 0xAC + 0x80 * (x - 1))) +#define LTDC_LxCFBLR(x) (MMIO32(LTDC_BASE + 0xB0 + 0x80 * (x - 1))) +#define LTDC_LxCFBLNR(x) (MMIO32(LTDC_BASE + 0xB4 + 0x80 * (x - 1))) +#define LTDC_LxCLUTWR(x) (MMIO32(LTDC_BASE + 0xC4 + 0x80 * (x - 1))) #define LTDC_LAYER_1 1 #define LTDC_LAYER_2 2 @@ -114,44 +114,110 @@ */ /* global */ -#define ltdc_ctrl_enable(ctrl_flags) \ - LTDC_GCR |= ctrl_flags -#define ltdc_ctrl_disable(ctrl_flags) \ - LTDC_GCR &= ~(ctrl_flags) -#define ltdc_reload(reload_flags) \ - LTDC_SRCR = reload_flags -#define ltdc_set_background_color(r,g,b) \ - LTDC_BCCR = (((r)&255)<<16) | (((g)&255)<<8) | (((b)&255)<<0); -#define ltdc_get_current_position(x,y) \ - { y=LTDC_CPSR; x=y>>16; y&=0xffff; } -#define ltdc_get_current_position_x() \ - (LTDC_CPSR>>16) -#define ltdc_get_current_position_y() \ - (LTDC_CPSR&0xffff) -#define ltdc_get_display_status(status_flags) \ - (LTDC_CDSR&(status_flags)) +static inline void ltdc_ctrl_enable(uint32_t ctrl_flags) +{ + LTDC_GCR |= ctrl_flags; +} + +static inline void ltdc_ctrl_disable(uint32_t ctrl_flags) +{ + LTDC_GCR &= ~(ctrl_flags); +} + +static inline void ltdc_reload(uint32_t reload_flags) +{ + LTDC_SRCR = reload_flags; +} + +static inline void ltdc_set_background_color(uint8_t r, uint8_t g, uint8_t b) +{ + LTDC_BCCR = (((r)&255)<<16) | + (((g)&255)<<8) | + (((b)&255)<<0); +} + +static inline void ltdc_get_current_position(uint16_t *x, uint16_t *y) +{ + uint32_t tmp = LTDC_CPSR; + *x = tmp >> 16; + *y = tmp &= 0xFFFF; +} + +static inline uint16_t ltdc_get_current_position_x(void) +{ + return LTDC_CPSR >> 16; +} + +static inline uint16_t ltdc_get_current_position_y(void) +{ + return LTDC_CPSR & 0xffff; +} + +static inline uint32_t ltdc_get_display_status(uint32_t status_flags) +{ + return LTDC_CDSR & status_flags; +} + /* layers */ -#define ltdc_layer_ctrl_enable(layer,ctrl_flags) \ - LTDC_LxCR(layer) |= ctrl_flags -#define ltdc_layer_ctrl_disable(layer,ctrl_flags) \ - LTDC_LxCR(layer) &= ~(ctrl_flags) -#define ltdc_set_color_key(layer,r,g,b) \ - LTDC_LxCKCR(layer) = ((((r)&255)<<16) | (((g)&255)<<8) | (((b)&255)<<0)) -#define ltdc_set_pixel_format(layer,format) \ - LTDC_LxPFCR(layer) = format -#define ltdc_set_constant_alpha(layer,alpha) \ - LTDC_LxCACR(layer) = ((alpha)&255) -#define ltdc_set_default_colors(layer,a,r,g,b) \ - LTDC_LxDCCR(layer) = \ - ((((a)&255)<<24) | (((r)&255)<<16) | (((g)&255)<<8) | (((b)&255)<<0)) -#define ltdc_set_blending_factors(layer,bf1,bf2) \ - LTDC_LxBFCR(layer) = ((bf1)<<8) | ((bf2)<<0) -#define ltdc_set_fbuffer_address(layer,address) \ - LTDC_LxCFBAR(layer) = (uint32_t)address -#define ltdc_set_fb_line_length(layer,len,pitch) \ - LTDC_LxCFBLR(layer) = ((((pitch)&0x1FFF)<<16) | (((len)&0x1FFF)<<0)) -#define ltdc_set_fb_line_count(layer, linecount) \ - LTDC_LxCFBLNR(layer) = (((linecount)&0x3FF)<<0) +static inline void ltdc_layer_ctrl_enable(uint32_t layer, uint32_t ctrl_flags) +{ + LTDC_LxCR(layer) |= ctrl_flags; +} + +static inline void ltdc_layer_ctrl_disable(uint32_t layer, uint32_t ctrl_flags) +{ + LTDC_LxCR(layer) &= ~(ctrl_flags); +} + +static inline void ltdc_set_color_key(uint32_t layer, + uint8_t r, uint8_t g, uint8_t b) +{ + LTDC_LxCKCR(layer) = ((((r)&255)<<16) | + (((g)&255)<<8) | + (((b)&255)<<0)); +} + +static inline void ltdc_set_pixel_format(uint32_t layer, uint32_t format) +{ + LTDC_LxPFCR(layer) = format; +} + +static inline void ltdc_set_constant_alpha(uint32_t layer, uint8_t alpha) +{ + LTDC_LxCACR(layer) = ((alpha)&255); +} + +static inline void ltdc_set_default_colors(uint32_t layer, + uint8_t a, + uint8_t r, uint8_t g, uint8_t b) +{ + LTDC_LxDCCR(layer) = ((((a)&255)<<24) | + (((r)&255)<<16) | + (((g)&255)<<8) | + (((b)&255)<<0)); +} + +static inline void ltdc_set_blending_factors(uint32_t layer, + uint8_t bf1, uint8_t bf2) +{ + LTDC_LxBFCR(layer) = ((bf1)<<8) | ((bf2)<<0); +} + +static inline void ltdc_set_fbuffer_address(uint32_t layer, uint32_t address) +{ + LTDC_LxCFBAR(layer) = (uint32_t)address; +} + +static inline void ltdc_set_fb_line_length(uint32_t layer, + uint16_t len, uint16_t pitch) +{ + LTDC_LxCFBLR(layer) = ((((pitch)&0x1FFF)<<16) | (((len)&0x1FFF)<<0)); +} + +static inline void ltdc_set_fb_line_count(uint32_t layer, uint16_t linecount) +{ + LTDC_LxCFBLNR(layer) = (((linecount)&0x3FF)<<0); +} /** * more complicated helper functions @@ -174,20 +240,23 @@ void ltdc_setup_windowing( * Helper function to wait for SRCR reload to complete or so */ -#define LTDC_SRCR_IS_RELOADING (LTDC_SRCR&(LTDC_SRCR_RELOAD_VBR|LTDC_SRCR_RELOAD_IMR)) - - +static inline bool LTDC_SRCR_IS_RELOADING(void) +{ + return (LTDC_SRCR & (LTDC_SRCR_RELOAD_VBR | + LTDC_SRCR_RELOAD_IMR)) != 0; +} /** * color conversion helper function * (simulate the ltdc color conversion) */ -#define ltdc_get_rgb888_from_rgb565(rgb888) ( \ - ((((rgb888) & 0xF800) >> (11-8))/31)<<16 \ - | ((((rgb888) & 0x07E0) << ( 8-5))/63)<<8 \ - | ((((rgb888) & 0x001F) << ( 8-0))/31)<<0 \ -) +static inline uint16_t ltdc_get_rgb888_from_rgb565(uint16_t rgb888) +{ + return ((((rgb888) & 0xF800) >> (11-8))/31)<<16 + | ((((rgb888) & 0x07E0) << (8-5))/63)<<8 + | ((((rgb888) & 0x001F) << (8-0))/31)<<0; +} #endif /* LIBOPENCM3_STM32_F4_LTDC_H_ */ diff --git a/include/libopencm3/stm32/f4/rcc.h b/include/libopencm3/stm32/f4/rcc.h index 15cca24f..9d7583dd 100644 --- a/include/libopencm3/stm32/f4/rcc.h +++ b/include/libopencm3/stm32/f4/rcc.h @@ -486,20 +486,39 @@ #define RCC_PLLI2SCFGR_PLLI2SN_SHIFT 6 /* --- RCC_DCKCFGR values -------------------------------------------------- */ -#define RCC_DCKCFGR_PLLSAIDIVR_MSK (0x3<<16) +#define RCC_DCKCFGR_PLLSAIDIVR_MSK (0x3 << 16) #define RCC_DCKCFGR_PLLSAIDIVR_DIVR_2 (0x0) #define RCC_DCKCFGR_PLLSAIDIVR_DIVR_4 (0x1) #define RCC_DCKCFGR_PLLSAIDIVR_DIVR_8 (0x2) #define RCC_DCKCFGR_PLLSAIDIVR_DIVR_16 (0x3) /* PLLSAI1 helper macros */ -#define rcc_pllsai_enable() RCC_CR |= RCC_CR_PLLSAION -#define rcc_pllsai_ready() (RCC_CR & RCC_CR_PLLSAIRDY) +static inline void rcc_pllsai_enable(void) +{ + RCC_CR |= RCC_CR_PLLSAION; +} + +static inline bool rcc_pllsai_ready(void) +{ + return (RCC_CR & RCC_CR_PLLSAIRDY) != 0; +} + /* pllsain=49..432, pllsaiq=2..15, pllsair=2..7 */ -#define rcc_pllsai_config(pllsain,pllsaiq,pllsair) \ - RCC_PLLSAICFGR = (((pllsain&0x1ff)<<6) | ((pllsaiq&0xF)<<24) | ((pllsair&0x7)<<28)) -#define rcc_ltdc_set_clock_divr(pllsaidivr) \ - RCC_DCKCFGR = (((RCC_DCKCFGR & ~RCC_DCKCFGR_PLLSAIDIVR_MSK)|((pllsaidivr&0x3)<<16))) +static inline void rcc_pllsai_config(uint16_t pllsain, + uint16_t pllsaiq, + uint16_t pllsair) +{ + RCC_PLLSAICFGR = (((pllsain & 0x1ff) << 6) | + ((pllsaiq & 0xF) << 24) | + ((pllsair & 0x7) << 28)); +} + +static inline void rcc_ltdc_set_clock_divr(uint8_t pllsaidivr) +{ + RCC_DCKCFGR = (((RCC_DCKCFGR & + ~RCC_DCKCFGR_PLLSAIDIVR_MSK) | + ((pllsaidivr & 0x3) << 16))); +} /* --- Variable definitions ------------------------------------------------ */ extern uint32_t rcc_ahb_frequency; diff --git a/lib/stm32/f4/ltdc.c b/lib/stm32/f4/ltdc.c index b14eaa26..83a13961 100644 --- a/lib/stm32/f4/ltdc.c +++ b/lib/stm32/f4/ltdc.c @@ -40,50 +40,50 @@ * along with this library. If not, see . */ - #include -void ltdc_set_tft_sync_timings( - uint16_t sync_width, uint16_t sync_height, - uint16_t h_back_porch, uint16_t v_back_porch, - uint16_t active_width, uint16_t active_height, - uint16_t h_front_porch, uint16_t v_front_porch -) { +void ltdc_set_tft_sync_timings(uint16_t sync_width, uint16_t sync_height, + uint16_t h_back_porch, uint16_t v_back_porch, + uint16_t active_width, uint16_t active_height, + uint16_t h_front_porch, uint16_t v_front_porch) +{ /*assert((active_width <= 0x400) && (active_height <= 0x300));*/ - uint16_t w,h; - w=sync_width -1; - h=sync_height -1; + uint16_t w, h; + w = sync_width - 1; + h = sync_height - 1; /*assert((w&0xfff == w) && (h&0x7ff == h));*/ - LTDC_SSCR = (w<<16) | (h<<0); + LTDC_SSCR = (w << 16) | (h << 0); - w+=h_back_porch; - h+=v_back_porch; + w += h_back_porch; + h += v_back_porch; /*assert((w&0xfff == w) && (h&0x7ff == h));*/ - LTDC_BPCR = (w<<16) | (h<<0); + LTDC_BPCR = (w << 16) | (h << 0); - w+=active_width; - h+=active_height; + w += active_width; + h += active_height; /*assert((w&0xfff == w) && (h&0x7ff == h));*/ - LTDC_AWCR = (w<<16) | (h<<0); + LTDC_AWCR = (w << 16) | (h << 0); - w+=h_front_porch; - h+=v_front_porch; + w += h_front_porch; + h += v_front_porch; /*assert((w&0xfff == w) && (h&0x7ff == h));*/ - LTDC_TWCR = (w<<16) | (h<<0); -} -void ltdc_setup_windowing( - uint8_t layer_number, - uint16_t h_back_porch, uint16_t v_back_porch, - uint16_t active_width, uint16_t active_height -) { - active_width += h_back_porch-1; - active_height += v_back_porch-1; - /*assert( - (h_back_porch&0xfff == h_back_porch) && (v_back_porch &0xfff == v_back_porch) && - (active_width&0xfff == active_width) && (active_height&0xfff == active_height) - );*/ - LTDC_LxWHPCR(layer_number) = (active_width <<16) | (h_back_porch<<0); - LTDC_LxWVPCR(layer_number) = (active_height<<16) | (v_back_porch<<0); + LTDC_TWCR = (w << 16) | (h << 0); +} + +void ltdc_setup_windowing(uint8_t layer_number, + uint16_t h_back_porch, uint16_t v_back_porch, + uint16_t active_width, uint16_t active_height) +{ + active_width += h_back_porch - 1; + active_height += v_back_porch - 1; + /*assert((h_back_porch & 0xfff == h_back_porch) && + (v_back_porch & 0xfff == v_back_porch) && + (active_width & 0xfff == active_width) && + (active_height & 0xfff == active_height));*/ + LTDC_LxWHPCR(layer_number) = (active_width << 16) | + (h_back_porch << 0); + LTDC_LxWVPCR(layer_number) = (active_height << 16) | + (v_back_porch << 0); }