Changeset 04c7003f in mainline
- Timestamp:
- 2010-05-14T08:11:15Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- cf8cc36
- Parents:
- f619943a
- Files:
-
- 1 added
- 1 deleted
- 4 edited
- 3 moved
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/amd64/Makefile.inc
rf619943a r04c7003f 41 41 pciintel \ 42 42 isa \ 43 serial43 ns8250 44 44 45 45 RD_DRV_CONF = \ -
uspace/Makefile
rf619943a r04c7003f 80 80 DIRS += srv/drivers/pciintel 81 81 DIRS += srv/drivers/isa 82 DIRS += srv/drivers/ serial82 DIRS += srv/drivers/ns8250 83 83 # DIRS += srv/hw/bus/pci 84 84 endif -
uspace/srv/devman/main.c
rf619943a r04c7003f 90 90 driver = find_driver(&drivers_list, drv_name); 91 91 92 if (NULL == driver) { 93 printf(NAME ": no driver named %s was found.\n", drv_name); 94 free(drv_name); 95 drv_name = NULL; 96 ipc_answer_0(iid, ENOENT); 97 return NULL; 98 } 99 92 100 free(drv_name); 93 101 drv_name = NULL; 94 95 if (NULL == driver) {96 printf(NAME ": no driver named %s was found.\n", drv_name);97 ipc_answer_0(iid, ENOENT);98 return NULL;99 }100 102 101 103 // Create connection to the driver -
uspace/srv/drivers/isa/isa.dev
rf619943a r04c7003f 1 1 com1: 2 match 100 isa/ serial2 match 100 isa/ns8250 3 3 irq 4 4 4 io_range 3f8 8 5 5 6 6 com2: 7 match 100 isa/ serial7 match 100 isa/ns8250 8 8 irq 3 9 9 io_range 2f8 8 -
uspace/srv/drivers/ns8250/Makefile
rf619943a r04c7003f 29 29 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBC_PREFIX)/libc.a 30 30 31 OUTPUT = serial31 OUTPUT = ns8250 32 32 33 33 SOURCES = \ 34 serial.c34 ns8250.c 35 35 36 36 include ../../Makefile.common -
uspace/srv/drivers/ns8250/cyclic_buffer.h
rf619943a r04c7003f 27 27 */ 28 28 29 /** @addtogroup serial29 /** @addtogroup ns8250 30 30 * @{ 31 31 */ -
uspace/srv/drivers/ns8250/ns8250.c
rf619943a r04c7003f 28 28 29 29 /** 30 * @defgroup serialSerial port driver.30 * @defgroup ns8250 Serial port driver. 31 31 * @brief HelenOS serial port driver. 32 32 * @{ … … 63 63 #include "cyclic_buffer.h" 64 64 65 #define NAME " serial"65 #define NAME "ns8250" 66 66 67 67 #define REG_COUNT 7 68 68 #define MAX_BAUD_RATE 115200 69 69 70 typedef struct serial_dev_data {70 typedef struct ns8250_dev_data { 71 71 bool client_connected; 72 72 int irq; … … 75 75 cyclic_buffer_t input_buffer; 76 76 fibril_mutex_t mutex; 77 } serial_dev_data_t;78 79 static serial_dev_data_t * create_serial_dev_data()80 { 81 serial_dev_data_t *data = (serial_dev_data_t *)malloc(sizeof(serial_dev_data_t));77 } ns8250_dev_data_t; 78 79 static ns8250_dev_data_t * create_ns8250_dev_data() 80 { 81 ns8250_dev_data_t *data = (ns8250_dev_data_t *)malloc(sizeof(ns8250_dev_data_t)); 82 82 if (NULL != data) { 83 memset(data, 0, sizeof( serial_dev_data_t));83 memset(data, 0, sizeof(ns8250_dev_data_t)); 84 84 fibril_mutex_initialize(&data->mutex); 85 85 } … … 87 87 } 88 88 89 static void delete_ serial_dev_data(serial_dev_data_t *data)89 static void delete_ns8250_dev_data(ns8250_dev_data_t *data) 90 90 { 91 91 if (NULL != data) { … … 94 94 } 95 95 96 static bool serial_received(ioport8_t *port)96 static bool ns8250_received(ioport8_t *port) 97 97 { 98 98 return (pio_read_8(port + 5) & 1) != 0; 99 99 } 100 100 101 static uint8_t serial_read_8(ioport8_t *port)101 static uint8_t ns8250_read_8(ioport8_t *port) 102 102 { 103 103 return pio_read_8(port); … … 109 109 } 110 110 111 static void serial_write_8(ioport8_t *port, uint8_t c)111 static void ns8250_write_8(ioport8_t *port, uint8_t c) 112 112 { 113 113 while (!is_transmit_empty(port)) … … 117 117 } 118 118 119 static int serial_read(device_t *dev, char *buf, size_t count)120 { 121 // printf(NAME ": serial_read %s\n", dev->name);119 static int ns8250_read(device_t *dev, char *buf, size_t count) 120 { 121 // printf(NAME ": ns8250_read %s\n", dev->name); 122 122 123 123 int ret = 0; 124 124 125 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;125 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 126 126 fibril_mutex_lock(&data->mutex); 127 127 … … 136 136 } 137 137 138 static inline void serial_putchar(serial_dev_data_t *data, uint8_t c)138 static inline void ns8250_putchar(ns8250_dev_data_t *data, uint8_t c) 139 139 { 140 140 fibril_mutex_lock(&data->mutex); 141 serial_write_8(data->port, c);141 ns8250_write_8(data->port, c); 142 142 fibril_mutex_unlock(&data->mutex); 143 143 } 144 144 145 static int serial_write(device_t *dev, char *buf, size_t count)146 { 147 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;145 static int ns8250_write(device_t *dev, char *buf, size_t count) 146 { 147 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 148 148 149 149 size_t idx; 150 150 for (idx = 0; idx < count; idx++) { 151 serial_putchar(data, (uint8_t)buf[idx]);151 ns8250_putchar(data, (uint8_t)buf[idx]); 152 152 } 153 153 … … 155 155 } 156 156 157 static device_class_t serial_dev_class;158 159 static char_iface_t serial_char_iface = {160 .read = & serial_read,161 .write = & serial_write157 static device_class_t ns8250_dev_class; 158 159 static char_iface_t ns8250_char_iface = { 160 .read = &ns8250_read, 161 .write = &ns8250_write 162 162 }; 163 163 164 static int serial_add_device(device_t *dev);164 static int ns8250_add_device(device_t *dev); 165 165 166 166 /** The serial port device driver's standard operations. 167 167 */ 168 static driver_ops_t serial_ops = {169 .add_device = & serial_add_device168 static driver_ops_t ns8250_ops = { 169 .add_device = &ns8250_add_device 170 170 }; 171 171 172 172 /** The serial port device driver structure. 173 173 */ 174 static driver_t serial_driver = {174 static driver_t ns8250_driver = { 175 175 .name = NAME, 176 .driver_ops = & serial_ops176 .driver_ops = &ns8250_ops 177 177 }; 178 178 179 static void serial_dev_cleanup(device_t *dev)179 static void ns8250_dev_cleanup(device_t *dev) 180 180 { 181 181 if (NULL != dev->driver_data) { 182 delete_ serial_dev_data((serial_dev_data_t*)dev->driver_data);182 delete_ns8250_dev_data((ns8250_dev_data_t*)dev->driver_data); 183 183 dev->driver_data = NULL; 184 184 } … … 190 190 } 191 191 192 static bool serial_pio_enable(device_t *dev)193 { 194 printf(NAME ": serial_pio_enable %s\n", dev->name);195 196 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;192 static bool ns8250_pio_enable(device_t *dev) 193 { 194 printf(NAME ": ns8250_pio_enable %s\n", dev->name); 195 196 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 197 197 198 198 // Gain control over port's registers. … … 205 205 } 206 206 207 static bool serial_dev_probe(device_t *dev)208 { 209 printf(NAME ": serial_dev_probe %s\n", dev->name);210 211 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;207 static bool ns8250_dev_probe(device_t *dev) 208 { 209 printf(NAME ": ns8250_dev_probe %s\n", dev->name); 210 211 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 212 212 ioport8_t *port_addr = data->port; 213 213 bool res = true; … … 235 235 } 236 236 237 static int serial_dev_initialize(device_t *dev)238 { 239 printf(NAME ": serial_dev_initialize %s\n", dev->name);237 static int ns8250_dev_initialize(device_t *dev) 238 { 239 printf(NAME ": ns8250_dev_initialize %s\n", dev->name); 240 240 241 241 int ret = EOK; … … 244 244 245 245 // allocate driver data for the device 246 serial_dev_data_t *data = create_serial_dev_data();246 ns8250_dev_data_t *data = create_ns8250_dev_data(); 247 247 if (NULL == data) { 248 248 return ENOMEM; … … 304 304 305 305 failed: 306 serial_dev_cleanup(dev);306 ns8250_dev_cleanup(dev); 307 307 clean_hw_resource_list(&hw_resources); 308 308 return ret; 309 309 } 310 310 311 static inline void serial_port_interrupts_enable(ioport8_t *port)311 static inline void ns8250_port_interrupts_enable(ioport8_t *port) 312 312 { 313 313 pio_write_8(port + 1 , 0x01); // Interrupt when data received … … 315 315 } 316 316 317 static inline void serial_port_interrupts_disable(ioport8_t *port)317 static inline void ns8250_port_interrupts_disable(ioport8_t *port) 318 318 { 319 319 pio_write_8(port + 1, 0x00); // Disable all interrupts 320 320 } 321 321 322 static int serial_interrupt_enable(device_t *dev)323 { 324 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;322 static int ns8250_interrupt_enable(device_t *dev) 323 { 324 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 325 325 326 326 int res; … … 331 331 332 332 // enable interrupt on the serial port 333 serial_port_interrupts_enable(data->port);333 ns8250_port_interrupts_enable(data->port); 334 334 335 335 return EOK; 336 336 } 337 337 338 static int serial_port_set_baud_rate(ioport8_t *port, unsigned int baud_rate)338 static int ns8250_port_set_baud_rate(ioport8_t *port, unsigned int baud_rate) 339 339 { 340 340 uint16_t divisor; … … 360 360 } 361 361 362 static int serial_set_baud_rate(device_t *dev, unsigned int baud_rate)363 { 364 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;362 static int ns8250_set_baud_rate(device_t *dev, unsigned int baud_rate) 363 { 364 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 365 365 ioport8_t *port = data->port; 366 366 int ret; … … 369 369 370 370 fibril_mutex_lock(&data->mutex); 371 serial_port_interrupts_disable(port); // Disable all interrupts372 ret = serial_port_set_baud_rate(port, baud_rate);373 serial_port_interrupts_enable(port);371 ns8250_port_interrupts_disable(port); // Disable all interrupts 372 ret = ns8250_port_set_baud_rate(port, baud_rate); 373 ns8250_port_interrupts_enable(port); 374 374 fibril_mutex_unlock(&data->mutex); 375 375 … … 377 377 } 378 378 379 static void serial_initialize_port(device_t *dev)380 { 381 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;379 static void ns8250_initialize_port(device_t *dev) 380 { 381 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 382 382 ioport8_t *port = data->port; 383 383 384 serial_port_interrupts_disable(port); // Disable all interrupts385 serial_port_set_baud_rate(port, 38400);384 ns8250_port_interrupts_disable(port); // Disable all interrupts 385 ns8250_port_set_baud_rate(port, 38400); 386 386 pio_write_8(port + 3, 0x07); // 8 bits, no parity, two stop bits 387 387 pio_write_8(port + 2, 0xC7); // Enable FIFO, clear them, with 14-byte threshold … … 390 390 } 391 391 392 static void serial_read_from_device(device_t *dev)393 { 394 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;392 static void ns8250_read_from_device(device_t *dev) 393 { 394 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 395 395 ioport8_t *port = data->port; 396 396 bool cont = true; … … 399 399 fibril_mutex_lock(&data->mutex); 400 400 401 if (cont = serial_received(port)) {402 uint8_t val = serial_read_8(port);401 if (cont = ns8250_received(port)) { 402 uint8_t val = ns8250_read_8(port); 403 403 // printf(NAME ": character %c read from %s.\n", val, dev->name); 404 404 … … 420 420 } 421 421 422 static inline void serial_interrupt_handler(device_t *dev, ipc_callid_t iid, ipc_call_t *icall)423 { 424 serial_read_from_device(dev);425 } 426 427 static inline int serial_register_interrupt_handler(device_t *dev)428 { 429 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;430 431 return register_interrupt_handler(dev, data->irq, serial_interrupt_handler, NULL);432 } 433 434 static inline int serial_unregister_interrupt_handler(device_t *dev)435 { 436 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;422 static inline void ns8250_interrupt_handler(device_t *dev, ipc_callid_t iid, ipc_call_t *icall) 423 { 424 ns8250_read_from_device(dev); 425 } 426 427 static inline int ns8250_register_interrupt_handler(device_t *dev) 428 { 429 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 430 431 return register_interrupt_handler(dev, data->irq, ns8250_interrupt_handler, NULL); 432 } 433 434 static inline int ns8250_unregister_interrupt_handler(device_t *dev) 435 { 436 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 437 437 438 438 return unregister_interrupt_handler(dev, data->irq); 439 439 } 440 440 441 static int serial_add_device(device_t *dev)442 { 443 printf(NAME ": serial_add_device %s (handle = %d)\n", dev->name, dev->handle);444 445 int res = serial_dev_initialize(dev);441 static int ns8250_add_device(device_t *dev) 442 { 443 printf(NAME ": ns8250_add_device %s (handle = %d)\n", dev->name, dev->handle); 444 445 int res = ns8250_dev_initialize(dev); 446 446 if (EOK != res) { 447 447 return res; 448 448 } 449 449 450 if (! serial_pio_enable(dev)) {451 serial_dev_cleanup(dev);450 if (!ns8250_pio_enable(dev)) { 451 ns8250_dev_cleanup(dev); 452 452 return EADDRNOTAVAIL; 453 453 } 454 454 455 455 // find out whether the device is present 456 if (! serial_dev_probe(dev)) {457 serial_dev_cleanup(dev);456 if (!ns8250_dev_probe(dev)) { 457 ns8250_dev_cleanup(dev); 458 458 return ENOENT; 459 459 } 460 460 461 461 // serial port initialization (baud rate etc.) 462 serial_initialize_port(dev);462 ns8250_initialize_port(dev); 463 463 464 464 // register interrupt handler 465 if (EOK != serial_register_interrupt_handler(dev)) {465 if (EOK != ns8250_register_interrupt_handler(dev)) { 466 466 printf(NAME ": failed to register interrupt handler.\n"); 467 serial_dev_cleanup(dev);467 ns8250_dev_cleanup(dev); 468 468 return res; 469 469 } 470 470 471 471 // enable interrupt 472 if (EOK != (res = serial_interrupt_enable(dev))) {472 if (EOK != (res = ns8250_interrupt_enable(dev))) { 473 473 printf(NAME ": failed to enable the interrupt. Error code = %d.\n", res); 474 serial_dev_cleanup(dev);475 serial_unregister_interrupt_handler(dev);474 ns8250_dev_cleanup(dev); 475 ns8250_unregister_interrupt_handler(dev); 476 476 return res; 477 477 } 478 478 479 dev->class = & serial_dev_class;479 dev->class = &ns8250_dev_class; 480 480 481 481 printf(NAME ": the %s device has been successfully initialized.\n", dev->name); … … 490 490 * @param dev the device. 491 491 */ 492 static int serial_open(device_t *dev)493 { 494 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;492 static int ns8250_open(device_t *dev) 493 { 494 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 495 495 int res; 496 496 … … 515 515 * @param dev the device. 516 516 */ 517 static void serial_close(device_t *dev)518 { 519 serial_dev_data_t *data = (serial_dev_data_t *)dev->driver_data;517 static void ns8250_close(device_t *dev) 518 { 519 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 520 520 521 521 fibril_mutex_lock(&data->mutex); … … 533 533 * Configure the parameters of the serial communication. 534 534 */ 535 static void serial_default_handler(device_t *dev, ipc_callid_t callid, ipc_call_t *call)535 static void ns8250_default_handler(device_t *dev, ipc_callid_t callid, ipc_call_t *call) 536 536 { 537 537 ipcarg_t method = IPC_GET_METHOD(*call); … … 540 540 switch(method) { 541 541 case SERIAL_SET_BAUD_RATE: 542 ret = serial_set_baud_rate(dev, IPC_GET_ARG1(*call));542 ret = ns8250_set_baud_rate(dev, IPC_GET_ARG1(*call)); 543 543 ipc_answer_0(callid, ret); 544 544 break; … … 559 559 * client requests to the serial port devices. 560 560 */ 561 static void serial_init()561 static void ns8250_init() 562 562 { 563 563 // TODO 564 serial_dev_class.id = 0;565 serial_dev_class.open = &serial_open;566 serial_dev_class.close = &serial_close;567 568 serial_dev_class.interfaces[CHAR_DEV_IFACE] = &serial_char_iface;569 serial_dev_class.default_handler = &serial_default_handler;564 ns8250_dev_class.id = 0; 565 ns8250_dev_class.open = &ns8250_open; 566 ns8250_dev_class.close = &ns8250_close; 567 568 ns8250_dev_class.interfaces[CHAR_DEV_IFACE] = &ns8250_char_iface; 569 ns8250_dev_class.default_handler = &ns8250_default_handler; 570 570 } 571 571 … … 573 573 { 574 574 printf(NAME ": HelenOS serial port driver\n"); 575 serial_init();576 return driver_main(& serial_driver);575 ns8250_init(); 576 return driver_main(&ns8250_driver); 577 577 } 578 578
Note:
See TracChangeset
for help on using the changeset viewer.