Changeset 965dc18 in mainline for kernel/genarch
- Timestamp:
- 2008-12-05T19:59:03Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 49093a4
- Parents:
- 0258e67
- Location:
- kernel/genarch
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/include/fb/fb.h
r0258e67 r965dc18 39 39 #include <synch/spinlock.h> 40 40 41 /** 42 * Properties of the framebuffer device. 43 */ 44 typedef struct fb_properties { 45 /** Physical address of the framebuffer device. */ 46 uintptr_t addr; 47 48 /** 49 * Address where the first (top left) pixel is mapped, 50 * relative to "addr". 51 */ 52 unsigned int offset; 53 54 /** Screen width in pixels. */ 55 unsigned int x; 56 57 /** Screen height in pixels. */ 58 unsigned int y; 59 60 /** Bytes per one scanline. */ 61 unsigned int scan; 62 63 /** Color model. */ 64 unsigned int visual; 65 } fb_properties_t; 66 41 67 SPINLOCK_EXTERN(fb_lock); 42 void fb_init( uintptr_t addr, unsigned int x, unsigned int y, unsigned int scan, unsigned int visual);68 void fb_init(fb_properties_t *props); 43 69 44 70 #endif -
kernel/genarch/include/fb/visuals.h
r0258e67 r965dc18 45 45 46 46 #define VISUAL_BGR_0_8_8_8 6 47 #define VISUAL_SB1500_PALETTE 7 47 48 48 49 #endif -
kernel/genarch/include/ofw/ofw_tree.h
r0258e67 r965dc18 173 173 extern ofw_tree_node_t *ofw_tree_find_peer_by_device_type(ofw_tree_node_t *, 174 174 const char *); 175 extern ofw_tree_node_t *ofw_tree_find_peer_by_name(ofw_tree_node_t *node, 176 const char *name); 175 177 extern ofw_tree_node_t *ofw_tree_find_node_by_handle(ofw_tree_node_t *, 176 178 uint32_t); -
kernel/genarch/src/fb/fb.c
r0258e67 r965dc18 190 190 *((uint8_t *) dst) = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | 191 191 BLUE(rgb, 3); 192 } 193 194 static void sb1500rgb_byte8(void *dst, int rgb) 195 { 196 if (RED(rgb, 1) && GREEN(rgb, 1) && BLUE(rgb, 1)) 197 *((uint8_t *) dst) = 255; 198 else if (RED(rgb, 1) && GREEN(rgb, 1)) 199 *((uint8_t *) dst) = 150; 200 else if (GREEN(rgb, 1) && BLUE(rgb, 1)) 201 *((uint8_t *) dst) = 47; 202 else if (RED(rgb, 1) && BLUE(rgb, 1)) 203 *((uint8_t *) dst) = 48; 204 else if (RED(rgb, 1)) 205 *((uint8_t *) dst) = 32; 206 else if (GREEN(rgb, 1)) 207 *((uint8_t *) dst) = 47; 208 else if (BLUE(rgb, 1)) 209 *((uint8_t *) dst) = 2; 210 else 211 *((uint8_t *) dst) = 1; 192 212 } 193 213 … … 437 457 /** Initialize framebuffer as a chardev output device 438 458 * 439 * @param addr Physical address of the framebuffer 440 * @param x Screen width in pixels 441 * @param y Screen height in pixels 442 * @param scan Bytes per one scanline 443 * @param visual Color model 444 * 445 */ 446 void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int scan, 447 unsigned int visual) 448 { 449 switch (visual) { 459 * @param props Properties of the framebuffer device. 460 */ 461 void fb_init(fb_properties_t *props) 462 { 463 switch (props->visual) { 450 464 case VISUAL_INDIRECT_8: 451 465 rgb2scr = rgb_byte8; … … 453 467 pixelbytes = 1; 454 468 break; 469 case VISUAL_SB1500_PALETTE: 470 rgb2scr = sb1500rgb_byte8; 471 scr2rgb = byte8_rgb; 472 pixelbytes = 1; 473 break; 455 474 case VISUAL_RGB_5_5_5: 456 475 rgb2scr = rgb_byte555; … … 487 506 } 488 507 489 unsigned int fbsize = scan * y;508 unsigned int fbsize = props->scan * props->y + props->offset; 490 509 491 510 /* Map the framebuffer */ 492 fbaddress = (uint8_t *) hw_map((uintptr_t) addr, fbsize); 493 494 xres = x; 495 yres = y; 496 scanline = scan; 497 498 rows = y / FONT_SCANLINES; 499 columns = x / COL_WIDTH; 500 501 fb_parea.pbase = (uintptr_t) addr; 511 fbaddress = (uint8_t *) hw_map((uintptr_t) props->addr, fbsize); 512 fbaddress += props->offset; 513 514 xres = props->x; 515 yres = props->y; 516 scanline = props->scan; 517 518 rows = props->y / FONT_SCANLINES; 519 columns = props->x / COL_WIDTH; 520 521 fb_parea.pbase = (uintptr_t) props->addr; 502 522 fb_parea.vbase = (uintptr_t) fbaddress; 503 523 fb_parea.frames = SIZE2FRAMES(fbsize); … … 509 529 sysinfo_set_item_val("fb.width", NULL, xres); 510 530 sysinfo_set_item_val("fb.height", NULL, yres); 511 sysinfo_set_item_val("fb.scanline", NULL, scan);512 sysinfo_set_item_val("fb.visual", NULL, visual);513 sysinfo_set_item_val("fb.address.physical", NULL, addr);531 sysinfo_set_item_val("fb.scanline", NULL, props->scan); 532 sysinfo_set_item_val("fb.visual", NULL, props->visual); 533 sysinfo_set_item_val("fb.address.physical", NULL, props->addr); 514 534 sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors); 515 535 … … 525 545 if (!blankline) 526 546 panic("Failed to allocate blank line for framebuffer."); 547 unsigned int x, y; 527 548 for (y = 0; y < FONT_SCANLINES; y++) 528 549 for (x = 0; x < xres; x++) -
kernel/genarch/src/ofw/ofw_tree.c
r0258e67 r965dc18 55 55 /** Get OpenFirmware node property. 56 56 * 57 * @param node Node in which to lookup the property. 58 * @param name Name of the property. 59 * 60 * @return Pointer to the property structure or NULL if no such property. 61 */ 62 ofw_tree_property_t *ofw_tree_getprop(const ofw_tree_node_t *node, const char *name) 57 * @param node Node in which to lookup the property. 58 * @param name Name of the property. 59 * 60 * @return Pointer to the property structure or NULL if no such 61 * property. 62 */ 63 ofw_tree_property_t * 64 ofw_tree_getprop(const ofw_tree_node_t *node, const char *name) 63 65 { 64 66 unsigned int i; … … 74 76 /** Return value of the 'name' property. 75 77 * 76 * @param node 77 * 78 * @return 78 * @param node Node of interest. 79 * 80 * @return Value of the 'name' property belonging to the node. 79 81 */ 80 82 const char *ofw_tree_node_name(const ofw_tree_node_t *node) … … 94 96 /** Lookup child of given name. 95 97 * 96 * @param node Node whose child is being looked up. 97 * @param name Name of the child being looked up. 98 * 99 * @return NULL if there is no such child or pointer to the matching child node. 98 * @param node Node whose child is being looked up. 99 * @param name Name of the child being looked up. 100 * 101 * @return NULL if there is no such child or pointer to the 102 * matching child node. 100 103 */ 101 104 ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *name) … … 128 131 /** Lookup first child of given device type. 129 132 * 130 * @param node Node whose child is being looked up. 131 * @param name Device type of the child being looked up. 132 * 133 * @return NULL if there is no such child or pointer to the matching child node. 134 */ 135 ofw_tree_node_t *ofw_tree_find_child_by_device_type(ofw_tree_node_t *node, const char *name) 133 * @param node Node whose child is being looked up. 134 * @param name Device type of the child being looked up. 135 * 136 * @return NULL if there is no such child or pointer to the 137 * matching child node. 138 */ 139 ofw_tree_node_t * 140 ofw_tree_find_child_by_device_type(ofw_tree_node_t *node, const char *name) 136 141 { 137 142 ofw_tree_node_t *cur; … … 154 159 * are looked up iteratively to avoid stack overflow. 155 160 * 156 * @param root Root of the searched subtree. 157 * @param handle OpenFirmware handle. 158 * 159 * @return NULL if there is no such node or pointer to the matching node. 160 */ 161 ofw_tree_node_t *ofw_tree_find_node_by_handle(ofw_tree_node_t *root, uint32_t handle) 161 * @param root Root of the searched subtree. 162 * @param handle OpenFirmware handle. 163 * 164 * @return NULL if there is no such node or pointer to the matching 165 * node. 166 */ 167 ofw_tree_node_t * 168 ofw_tree_find_node_by_handle(ofw_tree_node_t *root, uint32_t handle) 162 169 { 163 170 ofw_tree_node_t *cur; … … 181 188 /** Lookup first peer of given device type. 182 189 * 183 * @param node Node whose peer is being looked up. 184 * @param name Device type of the child being looked up. 185 * 186 * @return NULL if there is no such child or pointer to the matching child node. 187 */ 188 ofw_tree_node_t *ofw_tree_find_peer_by_device_type(ofw_tree_node_t *node, const char *name) 190 * @param node Node whose peer is being looked up. 191 * @param name Device type of the child being looked up. 192 * 193 * @return NULL if there is no such child or pointer to the 194 * matching child node. 195 */ 196 ofw_tree_node_t * 197 ofw_tree_find_peer_by_device_type(ofw_tree_node_t *node, const char *name) 189 198 { 190 199 ofw_tree_node_t *cur; … … 203 212 204 213 214 /** Lookup first peer of given name. 215 * 216 * @param node Node whose peer is being looked up. 217 * @param name Name of the child being looked up. 218 * 219 * @return NULL if there is no such peer or pointer to the matching 220 * peer node. 221 */ 222 ofw_tree_node_t * 223 ofw_tree_find_peer_by_name(ofw_tree_node_t *node, const char *name) 224 { 225 ofw_tree_node_t *cur; 226 ofw_tree_property_t *prop; 227 228 for (cur = node->peer; cur; cur = cur->peer) { 229 prop = ofw_tree_getprop(cur, "name"); 230 if (!prop || !prop->value) 231 continue; 232 if (strcmp(prop->value, name) == 0) 233 return cur; 234 } 235 236 return NULL; 237 } 238 205 239 /** Lookup OpenFirmware node by its path. 206 240 * 207 * @param path Path to the node. 208 * 209 * @return NULL if there is no such node or pointer to the leaf node. 241 * @param path Path to the node. 242 * 243 * @return NULL if there is no such node or pointer to the leaf 244 * node. 210 245 */ 211 246 ofw_tree_node_t *ofw_tree_lookup(const char *path) 212 247 { 213 char buf[NAME_BUF_LEN +1];248 char buf[NAME_BUF_LEN + 1]; 214 249 ofw_tree_node_t *node = ofw_root; 215 250 index_t i, j; … … 237 272 * iteratively in order to avoid stack overflow. 238 273 * 239 * @param node 240 * @param path 274 * @param node Root of the subtree. 275 * @param path Current path, NULL for the very root of the entire tree. 241 276 */ 242 277 static void ofw_tree_node_print(const ofw_tree_node_t *node, const char *path)
Note:
See TracChangeset
for help on using the changeset viewer.