Changeset 7fa2031 in mainline
- Timestamp:
- 2013-01-20T22:17:55Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f03f107
- Parents:
- 96228d0
- Location:
- uspace/drv/fb/amdm37x_dispc
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/fb/amdm37x_dispc/amdm37x_dispc.c
r96228d0 r7fa2031 36 36 #include <assert.h> 37 37 #include <errno.h> 38 #include <ddf/log.h> 39 #include <ddi.h> 40 #include <abi/mm/as.h> 38 41 39 42 #include "amdm37x_dispc.h" 40 43 44 45 static int change_mode(visualizer_t *vis, vslmode_t mode); 41 46 static int handle_damage(visualizer_t *vs, 42 47 sysarg_t x0, sysarg_t y0, sysarg_t width, sysarg_t height, 43 sysarg_t x_offset, sysarg_t y_offset) 44 { 45 return EOK; 46 } 48 sysarg_t x_offset, sysarg_t y_offset); 47 49 48 50 static const visualizer_ops_t amdm37x_dispc_vis_ops = { 51 .change_mode = change_mode, 49 52 .handle_damage = handle_damage, 50 53 // TODO DO we need dummy implementations of stuff like claim, yield, ... 51 54 }; 55 56 57 static unsigned visual2bpp(visual_t visual) 58 { 59 switch(visual) { 60 case VISUAL_INDIRECT_8: 61 return 1; 62 case VISUAL_RGB_5_5_5_LE: 63 case VISUAL_RGB_5_5_5_BE: 64 case VISUAL_RGB_5_6_5_LE: 65 case VISUAL_RGB_5_6_5_BE: 66 return 2; 67 case VISUAL_BGR_8_8_8: 68 case VISUAL_RGB_8_8_8: 69 return 3; 70 case VISUAL_BGR_0_8_8_8: 71 case VISUAL_BGR_8_8_8_0: 72 case VISUAL_ABGR_8_8_8_8: 73 case VISUAL_BGRA_8_8_8_8: 74 case VISUAL_RGB_0_8_8_8: 75 case VISUAL_RGB_8_8_8_0: 76 case VISUAL_ARGB_8_8_8_8: 77 case VISUAL_RGBA_8_8_8_8: 78 return 4; 79 case VISUAL_UNKNOWN: 80 return 0; 81 } 82 return 0; 83 } 52 84 53 85 static void mode_init(vslmode_list_element_t *mode, … … 74 106 assert(vis); 75 107 76 unsigned width = CONFIG_BFB_WIDTH; 77 unsigned height = CONFIG_BFB_HEIGHT; 78 unsigned bpp = CONFIG_BFB_BPP; 79 80 mode_init(&instance->modes[0], width, height, bpp); //TODO convert bpp to visual 108 instance->fb_data = NULL; 109 instance->size = 0; 110 111 visual_t visual = VISUAL_UNKNOWN; 112 113 switch (CONFIG_BFB_BPP) { 114 case 8: visual = VISUAL_INDIRECT_8; break; 115 case 16: visual = VISUAL_RGB_5_6_5_LE; break; 116 case 24: visual = VISUAL_BGR_8_8_8; break; 117 case 32: visual = VISUAL_RGB_8_8_8_0; break; 118 default: 119 return EINVAL; 120 } 121 122 int ret = pio_enable((void*)AMDM37x_DISPC_BASE_ADDRESS, 123 AMDM37x_DISPC_SIZE, (void**)&instance->regs); 124 if (ret != EOK) { 125 return EIO; 126 } 127 128 mode_init(&instance->modes[0], 129 CONFIG_BFB_WIDTH, CONFIG_BFB_HEIGHT, visual); 81 130 82 131 /* Handle vis stuff */ … … 93 142 }; 94 143 144 static int amdm37x_dispc_setup_fb(amdm37x_dispc_regs_t *regs, 145 unsigned x, unsigned y, unsigned bpp, uint32_t pa) 146 { 147 assert(regs); 148 /* Init sequence for dispc is in chapter 7.6.5.1.4 p. 1810, 149 * no idea what parts of that work. */ 150 151 /* Disable all interrupts */ 152 regs->irqenable = 0; 153 154 /* Pixel format specifics*/ 155 uint32_t attrib_pixel_format = 0; 156 uint32_t control_data_lanes = 0; 157 switch (bpp) 158 { 159 case 32: 160 attrib_pixel_format = AMDM37X_DISPC_GFX_ATTRIBUTES_FORMAT_RGBX; 161 control_data_lanes = AMDM37X_DISPC_CONTROL_TFTDATALINES_24B; 162 break; 163 case 24: 164 attrib_pixel_format = AMDM37X_DISPC_GFX_ATTRIBUTES_FORMAT_RGB24; 165 control_data_lanes = AMDM37X_DISPC_CONTROL_TFTDATALINES_24B; 166 break; 167 case 16: 168 attrib_pixel_format = AMDM37X_DISPC_GFX_ATTRIBUTES_FORMAT_RGB16; 169 control_data_lanes = AMDM37X_DISPC_CONTROL_TFTDATALINES_16B; 170 break; 171 default: 172 return EINVAL; 173 } 174 175 /* Prepare sizes */ 176 const uint32_t size_reg = 177 (((x - 1) & AMDM37X_DISPC_SIZE_WIDTH_MASK) 178 << AMDM37X_DISPC_SIZE_WIDTH_SHIFT) | 179 (((y - 1) & AMDM37X_DISPC_SIZE_HEIGHT_MASK) 180 << AMDM37X_DISPC_SIZE_HEIGHT_SHIFT); 181 182 /* modes taken from u-boot, for 1024x768 */ 183 // TODO replace magic values with actual correct values 184 // regs->timing_h = 0x1a4024c9; 185 // regs->timing_v = 0x02c00509; 186 // regs->pol_freq = 0x00007028; 187 // regs->divisor = 0x00010001; 188 189 /* setup output */ 190 regs->size_lcd = size_reg; 191 regs->size_dig = size_reg; 192 193 /* Nice blue default color */ 194 regs->default_color[0] = 0x0000ff; 195 regs->default_color[1] = 0x0000ff; 196 197 /* Setup control register */ 198 uint32_t control = 0 | 199 AMDM37X_DISPC_CONTROL_PCKFREEENABLE_FLAG | 200 (control_data_lanes << AMDM37X_DISPC_CONTROL_TFTDATALINES_SHIFT) | 201 AMDM37X_DISPC_CONTROL_GPOUT0_FLAG | 202 AMDM37X_DISPC_CONTROL_GPOUT1_FLAG; 203 regs->control = control; 204 205 /* No gamma stuff only data */ 206 uint32_t config = (AMDM37X_DISPC_CONFIG_LOADMODE_DATAEVERYFRAME 207 << AMDM37X_DISPC_CONFIG_LOADMODE_SHIFT); 208 regs->config = config; 209 210 211 /* Set framebuffer base address */ 212 regs->gfx.ba[0] = pa; 213 regs->gfx.ba[1] = pa; 214 regs->gfx.position = 0; 215 216 /* Setup fb size */ 217 regs->gfx.size = size_reg; 218 219 /* Set pixel format */ 220 uint32_t attribs = 0 | 221 (attrib_pixel_format << AMDM37X_DISPC_GFX_ATTRIBUTES_FORMAT_SHIFT); 222 regs->gfx.attributes = attribs; 223 224 /* 0x03ff03c0 is the default */ 225 regs->gfx.fifo_threshold = 0x03ff03c0; 226 /* This value should be stride - width, 1 means next pixel i.e. 227 * stride == width */ 228 regs->gfx.row_inc = 1; 229 /* number of bytes to next pixel in BPP multiples */ 230 regs->gfx.pixel_inc = 1; 231 /* only used if video is played over fb */ 232 regs->gfx.window_skip = 0; 233 /* Gamma and palette table */ 234 regs->gfx.table_ba = 0; 235 236 /* enable frame buffer graphics */ 237 regs->gfx.attributes |= AMDM37X_DISPC_GFX_ATTRIBUTES_ENABLE_FLAG; 238 /* Update register values */ 239 regs->control |= AMDM37X_DISPC_CONTROL_GOLCD_FLAG; 240 regs->control |= AMDM37X_DISPC_CONTROL_GODIGITAL_FLAG; 241 /* Enable output */ 242 regs->control |= AMDM37X_DISPC_CONTROL_LCD_ENABLE_FLAG; 243 regs->control |= AMDM37X_DISPC_CONTROL_DIGITAL_ENABLE_FLAG; 244 } 245 246 static int handle_damage(visualizer_t *vs, 247 sysarg_t x0, sysarg_t y0, sysarg_t width, sysarg_t height, 248 sysarg_t x_offset, sysarg_t y_offset) 249 { 250 ddf_log_fatal("Handling damage\n"); 251 return EOK; 252 } 253 254 static int change_mode(visualizer_t *vis, vslmode_t mode) 255 { 256 assert(vis); 257 assert(vis->dev_ctx); 258 259 amdm37x_dispc_t *dispc = vis->dev_ctx; 260 const unsigned bpp = visual2bpp(mode.cell_visual.pixel_visual); 261 const unsigned x = mode.screen_width; 262 const unsigned y = mode.screen_height; 263 ddf_log_note("Setting mode: %ux%ux%u\n", x, y, bpp); 264 const size_t size = x * y * bpp; 265 void *buffer, *pa; 266 int ret = dmamem_map_anonymous(size, AS_AREA_READ | AS_AREA_WRITE, 267 0, &pa, &buffer); 268 if (ret != EOK) { 269 ddf_log_error("Failed to get new FB\n"); 270 return ret; 271 } 272 amdm37x_dispc_setup_fb(dispc->regs, x, y, bpp, (uint32_t)pa); 273 274 if (dispc->fb_data) 275 dmamem_unmap_anonymous(dispc->fb_data); 276 return EOK; 277 } -
uspace/drv/fb/amdm37x_dispc/amdm37x_dispc_regs.h
r96228d0 r7fa2031 41 41 #define AMDM37x_DISPC_SIZE 1024 42 42 43 #include <assert.h>44 43 #include <macros.h> 45 44 … … 280 279 ioport32_t vid_preload[2]; 281 280 282 } __attribute__((packed)) amdm37x_dispc_regs_t; 283 284 static inline void amdm37x_dispc_setup_fb(amdm37x_dispc_regs_t *regs, 285 unsigned x, unsigned y, unsigned bpp, uintptr_t pa) 286 { 287 assert(regs); 288 /* Init sequence for dispc is in chapter 7.6.5.1.4 p. 1810, 289 * no idea what parts of that work. */ 290 291 /* Disable all interrupts */ 292 regs->irqenable = 0; 293 294 /* Pixel format specifics*/ 295 uint32_t attrib_pixel_format = 0; 296 uint32_t control_data_lanes = 0; 297 switch (bpp) 298 { 299 case 32: 300 attrib_pixel_format = AMDM37X_DISPC_GFX_ATTRIBUTES_FORMAT_RGBX; 301 control_data_lanes = AMDM37X_DISPC_CONTROL_TFTDATALINES_24B; 302 break; 303 case 24: 304 attrib_pixel_format = AMDM37X_DISPC_GFX_ATTRIBUTES_FORMAT_RGB24; 305 control_data_lanes = AMDM37X_DISPC_CONTROL_TFTDATALINES_24B; 306 break; 307 case 16: 308 attrib_pixel_format = AMDM37X_DISPC_GFX_ATTRIBUTES_FORMAT_RGB16; 309 control_data_lanes = AMDM37X_DISPC_CONTROL_TFTDATALINES_16B; 310 break; 311 default: 312 assert(false); 313 } 314 315 /* Prepare sizes */ 316 const uint32_t size_reg = 317 (((x - 1) & AMDM37X_DISPC_SIZE_WIDTH_MASK) 318 << AMDM37X_DISPC_SIZE_WIDTH_SHIFT) | 319 (((y - 1) & AMDM37X_DISPC_SIZE_HEIGHT_MASK) 320 << AMDM37X_DISPC_SIZE_HEIGHT_SHIFT); 321 322 /* modes taken from u-boot, for 1024x768 */ 323 // TODO replace magic values with actual correct values 324 // regs->timing_h = 0x1a4024c9; 325 // regs->timing_v = 0x02c00509; 326 // regs->pol_freq = 0x00007028; 327 // regs->divisor = 0x00010001; 328 329 /* setup output */ 330 regs->size_lcd = size_reg; 331 regs->size_dig = size_reg; 332 333 /* Nice blue default color */ 334 regs->default_color[0] = 0x0000ff; 335 regs->default_color[1] = 0x0000ff; 336 337 /* Setup control register */ 338 uint32_t control = 0 | 339 AMDM37X_DISPC_CONTROL_PCKFREEENABLE_FLAG | 340 (control_data_lanes << AMDM37X_DISPC_CONTROL_TFTDATALINES_SHIFT) | 341 AMDM37X_DISPC_CONTROL_GPOUT0_FLAG | 342 AMDM37X_DISPC_CONTROL_GPOUT1_FLAG; 343 regs->control = control; 344 345 /* No gamma stuff only data */ 346 uint32_t config = (AMDM37X_DISPC_CONFIG_LOADMODE_DATAEVERYFRAME 347 << AMDM37X_DISPC_CONFIG_LOADMODE_SHIFT); 348 regs->config = config; 349 350 351 /* Set framebuffer base address */ 352 regs->gfx.ba[0] = pa; 353 regs->gfx.ba[1] = pa; 354 regs->gfx.position = 0; 355 356 /* Setup fb size */ 357 regs->gfx.size = size_reg; 358 359 /* Set pixel format */ 360 uint32_t attribs = 0 | 361 (attrib_pixel_format << AMDM37X_DISPC_GFX_ATTRIBUTES_FORMAT_SHIFT); 362 regs->gfx.attributes = attribs; 363 364 /* 0x03ff03c0 is the default */ 365 regs->gfx.fifo_threshold = 0x03ff03c0; 366 /* This value should be stride - width, 1 means next pixel i.e. 367 * stride == width */ 368 regs->gfx.row_inc = 1; 369 /* number of bytes to next pixel in BPP multiples */ 370 regs->gfx.pixel_inc = 1; 371 /* only used if video is played over fb */ 372 regs->gfx.window_skip = 0; 373 /* Gamma and palette table */ 374 regs->gfx.table_ba = 0; 375 376 /* enable frame buffer graphics */ 377 regs->gfx.attributes |= AMDM37X_DISPC_GFX_ATTRIBUTES_ENABLE_FLAG; 378 /* Update register values */ 379 regs->control |= AMDM37X_DISPC_CONTROL_GOLCD_FLAG; 380 regs->control |= AMDM37X_DISPC_CONTROL_GODIGITAL_FLAG; 381 /* Enable output */ 382 regs->control |= AMDM37X_DISPC_CONTROL_LCD_ENABLE_FLAG; 383 regs->control |= AMDM37X_DISPC_CONTROL_DIGITAL_ENABLE_FLAG; 384 } 281 } amdm37x_dispc_regs_t; 282 385 283 386 284 #endif
Note:
See TracChangeset
for help on using the changeset viewer.