UDI Tutorial Driver WalkThrough Part 2 http www
- Slides: 27
UDI Tutorial & Driver Walk-Through Part 2 http: //www. sco. com/forum 1999/conference/developfast/f 10 Kurt Gollhardt SCO Core OS Architect E-mail: kdg@sco. com
Overview • Key Concepts • Description of Sample Driver • Walk-Through • Additional Examples • Hints & Tips F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 2
Walk-Through udi_cmos. c lines 243 -248 • Primary region initialization 243 244 245 246 247 248 static const udi_primary_init_t udi_cmos_primary_init_info = { &cmos_mgmt_ops, 0, /* mgmt_scratch_size */ 0, /* no children, so no enumeration */ sizeof(cmos_region_data_t) }; F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 3
Walk-Through udi_cmos. c lines 255 -285 • Channel ops initialization 255 256 257 258 260 261 262 263 static const udi_ops_init_t udi_cmos_ops_init_list[] = { { GIO_OPS_IDX, CMOS_GIO_META, UDI_GIO_PROVIDER_OPS_NUM, 0, /* no channel context */ (udi_ops_vector_t *) &cmos_gio_provider_ops }, . . . F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 4
Walk-Through udi_cmos. c lines 292 -346 • Control block initialization 292 293 294 295 296 297 298 299 300 static const udi_cb_init_t udi_cmos_cb_init_list[] = { { GIO_BIND_CB_IDX, CMOS_GIO_META, UDI_GIO_BIND_CB_NUM, GIO_BIND_SCRATCH, 0, /* inline size */ NULL /* inline layout */ }, . . . F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 5
Walk-Through udi_cmos. c lines 348 -355 • Driver initialization structure 348 349 350 351 352 353 354 355 const udi_init_info = { &udi_cmos_primary_init_info, NULL, /* secondary_init_list */ udi_cmos_ops_init_list, udi_cmos_cb_init_list, NULL, /* gcb_init_list */ NULL /* cb_select_list */ }; • udi_init_info is only well-known global name F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 6
Walk-Through udi_cmos. c lines 365 -381 • Handle channel events from parent (bridge) 365 366 367 368 369 370 371 372 373 374 375 378 379 380 381 static void cmos_parent_channel_event(udi_channel_event_cb_t *channel_event_cb) { switch (channel_event_cb->event) { case UDI_CHANNEL_BOUND: /* Allocate a bus bind control block. */ udi_cb_alloc(cmos_bind_to_parent_1, UDI_GCB(channel_event_cb), BUS_BIND_CB_IDX, channel_event_cb->gcb. channel); break; default: udi_channel_event_complete(channel_event_cb, UDI_OK); } } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 7
Walk-Through udi_cmos. c lines 384 -396 • Continue bind sequence after allocation 384 385 386 387 388 389 390 391 392 393 394 395 396 cmos_bind_to_parent_1( udi_cb_t *gcb, udi_cb_t *new_cb) { udi_bus_bind_cb_t *bus_bind_cb = UDI_MCB(new_cb, udi_bus_bind_cb_t); /* Keep a link back to the channel event CB for the ack. */ bus_bind_cb->gcb. initiator_context = gcb; /* Bind to the parent bus bridge driver. */ udi_bus_bind_req(bus_bind_cb); } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 8
Walk-Through udi_cmos. c lines 400 -429 • Received ack from bridge; map PIO device 400 401 402 403 404 405 406 418 424 425 426 427 428 429 static void cmos_bus_bind_ack( udi_bus_bind_cb_t *bus_bind_cb, udi_ubit 8_t preferred_endianness, udi_status_t status) { cmos_region_data_t *rdata = bus_bind_cb->gcb. context; rdata->bus_bind_cb = bus_bind_cb; udi_pio_map(cmos_bus_bind_ack_1, UDI_GCB(bus_bind_cb), CMOS_REGSET, CMOS_BASE, CMOS_LENGTH, cmos_trans_read, sizeof cmos_trans_read / sizeof(udi_pio_trans_t), UDI_PIO_STRICTORDER, CMOS_PACE); } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 9
Walk-Through udi_cmos. c lines 434 -448 • Map second PIO handle (2 trans lists) 434 435 436 437 438 441 442 443 444 445 446 447 448 cmos_bus_bind_ack_1( udi_cb_t *gcb, udi_pio_handle_t new_pio_handle) { cmos_region_data_t *rdata = gcb->context; rdata->trans_read = new_pio_handle; udi_pio_map(cmos_bus_bind_ack_2, gcb, CMOS_REGSET, CMOS_BASE, CMOS_LENGTH, cmos_trans_write, sizeof cmos_trans_write / sizeof(udi_pio_trans_t), UDI_PIO_STRICTORDER, CMOS_PACE); } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 10
Walk-Through udi_cmos. c lines 451 -468 • Bind sequence complete 451 452 453 454 455 456 457 458 459 460 465 466 467 468 cmos_bus_bind_ack_2( udi_cb_t *gcb, udi_pio_handle_t new_pio_handle) { cmos_region_data_t *rdata = gcb->context; udi_channel_event_cb_t *channel_event_cb = gcb->initiator_context; /* Save the PIO handle for later use. */ rdata->trans_write = new_pio_handle; /* Let the MA know we've completed binding. */ udi_channel_event_complete(channel_event_cb, UDI_OK); } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 11
Walk-Through udi_cmos. c lines 470 -480 • Child bind and unbind – This driver has no per-child state 470 471 472 473 474 475 476 477 478 479 480 static void cmos_gio_bind_req(udi_gio_bind_cb_t *gio_bind_cb) { udi_gio_bind_ack(gio_bind_cb, CMOS_DEVSIZE, 0, UDI_OK); } static void cmos_gio_unbind_req(udi_gio_bind_cb_t *gio_bind_cb) { udi_gio_unbind_ack(gio_bind_cb); } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 12
Walk-Through udi_cmos. c lines 492 -508 • Transfer request operation - READ case 492 493 494 495 501 502 503 504 505 506 507 508 cmos_gio_xfer_req(udi_gio_xfer_cb_t *gio_xfer_cb) { udi_gio_rw_params_t *rw_params = gio_xfer_cb->tr_params; switch (gio_xfer_cb->op) { case UDI_GIO_OP_READ: udi_assert(rw_params->offset_hi == 0 && rw_params->offset_lo < CMOS_DEVSIZE && gio_xfer_cb->data_buf->buf_size < CMOS_DEVSIZE - rw_params->offset_lo); cmos_do_read(gio_xfer_cb, rw_params->offset_lo); break; F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 13
Walk-Through udi_cmos. c lines 509 -519 • Transfer request operation - WRITE case 509 510 511 512 513 514 515 case UDI_GIO_OP_WRITE: udi_assert(rw_params->offset_hi == 0 && rw_params->offset_lo < CMOS_DEVSIZE && gio_xfer_cb->data_buf->buf_size < CMOS_DEVSIZE - rw_params->offset_lo); cmos_do_write(gio_xfer_cb, rw_params->offset_lo); break; • Transfer request operation - error case 516 517 518 519 default: udi_gio_xfer_nak(gio_xfer_cb, UDI_STAT_NOT_UNDERSTOOD); } } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 14
Walk-Through udi_cmos. c lines 525 -541 • Initiate PIO transactions for READ request 525 526 527 528 529 530 535 536 537 538 539 540 541 cmos_do_read(udi_gio_xfer_cb_t *gio_xfer_cb, udi_ubit 8_t addr) { cmos_region_data_t *rdata = gio_xfer_cb->gcb. context; cmos_gio_xfer_scratch_t *gio_xfer_scratch = gio_xfer_cb->gcb. scratch; gio_xfer_scratch->addr = addr; gio_xfer_scratch->count = gio_xfer_cb->data_buf->buf_size; udi_pio_trans(cmos_do_read_1, gcb, rdata->trans_read, new_buf, NULL); } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 15
Walk-Through udi_cmos. c lines 544 -560 • Complete READ request 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 cmos_do_read_1( udi_cb_t *gcb, udi_buf_t *new_buf, udi_status_t status, udi_ubit 16_t result) { udi_gio_xfer_cb_t *gio_xfer_cb = UDI_MCB(gcb, udi_gio_xfer_cb_t); /* udi_pio_trans may create a new buffer. */ gio_xfer_cb->data_buf = new_buf; if (status == UDI_OK) udi_gio_xfer_ack(gio_xfer_cb); else udi_gio_xfer_nak(gio_xfer_cb, status); } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 16
Walk-Through udi_cmos. c lines 566 -613 • WRITE case identical to READ except: – Uses trans_write instead of trans_read – Special case for CMOS driver: 572 573 574 575 576 577 578 579 580 581 /* * The first CMOS_RDONLY_SZ bytes of this device are not * allowed to be written through this driver. Fail any * attempt to write to these bytes. */ if (addr < CMOS_RDONLY_SZ) { udi_gio_xfer_nak(gio_xfer_cb, UDI_STAT_MISTAKEN_IDENTITY); return; } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 17
Walk-Through udi_cmos. c lines 615 -636 • Device Management - unbind from parent 616 617 618 620 621 623 624 628 629 631 632 633 634 635 636 cmos_devmgmt_req( udi_mgmt_cb_t *cb, udi_ubit 8_t mgmt_op, udi_ubit 8_t parent_id) { cmos_region_data_t *rdata = cb->gcb. context; switch (mgmt_op) { case UDI_DMGMT_UNBIND: /* Keep a link back to this CB for use in the ack */ rdata->bus_bind_cb->gcb. initiator_context = cb; /* Do the metalanguage-specific unbind. */ udi_bus_unbind_req(rdata->bus_bind_cb); default: udi_devmgmt_ack(cb, 0, UDI_OK); } } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 18
Walk-Through udi_cmos. c lines 639 -646 • Complete parent unbind sequence 639 640 641 642 643 644 645 646 cmos_bus_unbind_ack(udi_bus_bind_cb_t *bus_bind_cb) { udi_mgmt_cb_t *cb = bus_bind_cb->gcb. initiator_context; udi_cb_free(UDI_GCB(bus_bind_cb)); udi_devmgmt_ack(cb, 0, UDI_OK); } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 19
Walk-Through udi_cmos. c lines 384 -396 • Final cleanup – Called after all children/parents unbound 649 650 651 652 653 654 655 656 cmos_final_cleanup_req(udi_mgmt_cb_t *cb) { /* * We have nothing to free that wasn't already freed by * unbinding children and parents. */ udi_final_cleanup_ack(cb); } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 20
PIO Transaction List for READ udi_cmos. c lines 174 -185 174 175 176 177 178 179 180 181 182 183 184 185 /* R 0 <- SCRATCH_ADDR {offset into scratch of address} */ { UDI_PIO_LOAD_IMM+UDI_PIO_R 0, UDI_PIO_2 BYTE, SCRATCH_ADDR }, /* R 1 <- address */ { UDI_PIO_LOAD+UDI_PIO_SCRATCH+UDI_PIO_R 0, UDI_PIO_1 BYTE, UDI_PIO_R 1 }, /* R 0 <- SCRATCH_COUNT {offset into scratch of count} */ { UDI_PIO_LOAD_IMM+UDI_PIO_R 0, UDI_PIO_2 BYTE, SCRATCH_COUNT }, /* R 2 <- count */ { UDI_PIO_LOAD+UDI_PIO_SCRATCH+UDI_PIO_R 0, UDI_PIO_1 BYTE, UDI_PIO_R 2 }, /* R 0 <- 0 {current buffer offset} */ { UDI_PIO_LOAD_IMM+UDI_PIO_R 0, UDI_PIO_2 BYTE, 0 }, F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 21
PIO Transaction List for READ udi_cmos. c lines 186 -203 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 /* begin main loop */ { UDI_PIO_LABEL, 0, 1 }, /* output address from R 1 to address register */ { UDI_PIO_OUT+UDI_PIO_DIRECT+UDI_PIO_R 1, UDI_PIO_1 BYTE, CMOS_ADDR }, /* input value from data register into next buffer location */ { UDI_PIO_IN+UDI_PIO_BUF+UDI_PIO_R 0, UDI_PIO_1 BYTE, CMOS_DATA }, /* decrement count (in R 2) */ { UDI_PIO_ADD_IMM+UDI_PIO_R 2, UDI_PIO_1 BYTE, (udi_ubit 8_t)-1 }, /* if count is zero, we're done */ { UDI_PIO_CSKIP+UDI_PIO_R 2, UDI_PIO_1 BYTE, UDI_PIO_NZ }, { UDI_PIO_END, UDI_PIO_2 BYTE, 0 }, /* increment address and buffer offset */ { UDI_PIO_ADD_IMM+UDI_PIO_R 1, UDI_PIO_1 BYTE, 1 }, { UDI_PIO_ADD_IMM+UDI_PIO_R 0, UDI_PIO_1 BYTE, 1 }, /* go back to main loop */ { UDI_PIO_BRANCH, 0, 1 } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 22
Additional Examples Memory Allocation • Asynchronous service call udi_mem_alloc(callback, gcb, size, UDI_MEM_NOZERO); • Callback static void callback( udi_cb_t *gcb, void *new_mem ) { /* continue */ } F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 23
Additional Examples Memory Allocation - Limits • Size > limits. max_safe_alloc – Driver must cancel allocation if it takes too long » Start timer with udi_timer_start » Cancel allocation with udi_cancel » On success, cancel timer w/ udi_timer_cancel • Size <= UDI_MIN_ALLOC_LIMIT – Don’t need runtime test F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 24
Additional Examples Timers • Timer interval stored as udi_time_t – Seconds, nanoseconds udi_time_t interval = { 0, 1000000 }; udi_timer_start(callback, gcb, interval); • Timer callback static void callback(gcb); • Cancelling a timer udi_timer_cancel(gcb); F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 25
Hints & Tips • For debugging, try udi_debug_break(). • To print debug info, use udi_trace_write(). • Don’t forget to cancel pending timers during unbinding. • Keep pools of control blocks and buffers instead of allocating new ones for each request. F 10: UDI Tutorial & Driver Walk-Through, Part 2 © 1999 SCO All Rights Reserved - Slide 26
Presenter’s Notes Cover Page Go to “Notes Page View” to see this one Put this page at end of presentation so numbering of slides will remain accurate.
- Udi dahan
- Pythonhttps://www.google.com
- Omumaatu
- Show license udi
- Udi apsel
- Udi interface
- Udi helpdesk
- Gmdn codes
- User-mode driver framework
- Walkthrough of the parts of the entire work immersion
- Usability lab
- Openflow install
- Mc rel
- Cognitive walkthrough vs heuristic evaluation
- User interface design and implementation
- Walkthrough
- Cognitive walkthrough and heuristic evaluation
- Welcome to medieval times
- Cognitive walkthrough
- Adventure high walkthrough
- Vaultrepopulation
- Ddo walkthrough
- Requirements walkthrough
- Malloc lab walkthrough
- Bomb lab phase 4 walkthrough
- End roll walkthrough
- Classroom walkthrough app
- Heuristic walkthrough