Changes in / [571addd:5a9f4d7] in mainline
- Files:
-
- 4 deleted
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
r571addd r5a9f4d7 441 441 ! [(CONFIG_HID_OUT=generic|CONFIG_HID_OUT=serial)&PLATFORM=arm32&MACHINE=gta02] CONFIG_S3C24XX_UART (y/n) 442 442 443 % Support for Samsung S3C24XX on-chip interrupt controller444 ! [PLATFORM=arm32&MACHINE=gta02] CONFIG_S3C24XX_IRQC (y)445 446 443 % Support for Z8530 controller 447 444 ! [(CONFIG_HID_IN=generic|CONFIG_HID_IN=keyboard)&PLATFORM=sparc64&MACHINE=generic] CONFIG_Z8530 (y/n) … … 472 469 473 470 % Serial line input module 474 ! [CONFIG_DSRLNIN=y|(PLATFORM= arm32&MACHINE=gta02)|(PLATFORM=ia64&MACHINE=i460GX&CONFIG_NS16550=y)|(PLATFORM=ia64&MACHINE=ski)|(PLATFORM=sparc64&MACHINE=serengeti&CONFIG_SGCN_KBD=y)|(PLATFORM=sparc64&PROCESSOR=sun4v)] CONFIG_SRLN (y)471 ! [CONFIG_DSRLNIN=y|(PLATFORM=ia64&MACHINE=i460GX&CONFIG_NS16550=y)|(PLATFORM=ia64&MACHINE=ski)|(PLATFORM=sparc64&MACHINE=serengeti&CONFIG_SGCN_KBD=y)|(PLATFORM=sparc64&PROCESSOR=sun4v)] CONFIG_SRLN (y) 475 472 476 473 % EGA support -
boot/arch/arm32/Makefile.inc
r571addd r5a9f4d7 41 41 PAGE_SIZE = 4096 42 42 43 RD_SRVS_ESSENTIAL += \ 44 $(USPACE_PATH)/srv/hw/char/s3c24xx_uart/s3c24ser 43 RD_SRVS_ESSENTIAL += 45 44 46 45 RD_SRVS_NON_ESSENTIAL += \ -
kernel/arch/arm32/include/mach/integratorcp/integratorcp.h
r571addd r5a9f4d7 105 105 extern void icp_get_memory_extents(uintptr_t *, uintptr_t *); 106 106 extern void icp_frame_init(void); 107 extern size_t icp_get_irq_count(void);108 107 109 108 extern struct arm_machine_ops icp_machine_ops; -
kernel/arch/arm32/include/mach/testarm/testarm.h
r571addd r5a9f4d7 73 73 extern void gxemul_get_memory_extents(uintptr_t *, uintptr_t *); 74 74 extern void gxemul_frame_init(void); 75 extern size_t gxemul_get_irq_count(void);76 75 77 76 extern struct arm_machine_ops gxemul_machine_ops; -
kernel/arch/arm32/include/machine_func.h
r571addd r5a9f4d7 55 55 void (*machine_output_init)(void); 56 56 void (*machine_input_init)(void); 57 size_t (*machine_get_irq_count)(void);58 57 }; 59 58 -
kernel/arch/arm32/src/mach/gta02/gta02.c
r571addd r5a9f4d7 43 43 #include <genarch/drivers/s3c24xx_irqc/s3c24xx_irqc.h> 44 44 #include <genarch/drivers/s3c24xx_timer/s3c24xx_timer.h> 45 #include <genarch/srln/srln.h>46 #include <sysinfo/sysinfo.h>47 45 #include <interrupt.h> 48 46 #include <ddi/ddi.h> … … 70 68 static void gta02_output_init(void); 71 69 static void gta02_input_init(void); 72 static size_t gta02_get_irq_count(void);73 70 74 71 static void gta02_timer_irq_init(void); … … 77 74 static void gta02_timer_irq_handler(irq_t *irq); 78 75 79 static outdev_t *gta02_scons_dev;80 static s3c24xx_irqc_t gta02_irqc;76 static void *gta02_scons_out; 77 static s3c24xx_irqc_t *gta02_irqc; 81 78 static s3c24xx_timer_t *gta02_timer; 82 79 … … 91 88 gta02_frame_init, 92 89 gta02_output_init, 93 gta02_input_init, 94 gta02_get_irq_count 90 gta02_input_init 95 91 }; 96 92 97 93 static void gta02_init(void) 98 94 { 99 s3c24xx_irqc_regs_t *irqc_regs;100 95 gta02_scons_out = (void *) hw_map(GTA02_SCONS_BASE, PAGE_SIZE); 96 gta02_irqc = (void *) hw_map(S3C24XX_IRQC_ADDRESS, PAGE_SIZE); 101 97 gta02_timer = (void *) hw_map(S3C24XX_TIMER_ADDRESS, PAGE_SIZE); 102 irqc_regs = (void *) hw_map(S3C24XX_IRQC_ADDRESS, PAGE_SIZE); 103 104 /* Initialize interrupt controller. */ 105 s3c24xx_irqc_init(>a02_irqc, irqc_regs); 98 99 /* Make all interrupt sources use IRQ mode (not FIQ). */ 100 pio_write_32(>a02_irqc->intmod, 0x00000000); 101 102 /* Disable all interrupt sources. */ 103 pio_write_32(>a02_irqc->intmsk, 0xffffffff); 104 105 /* Disable interrupts from all sub-sources. */ 106 pio_write_32(>a02_irqc->intsubmsk, 0xffffffff); 106 107 } 107 108 … … 131 132 uint32_t inum; 132 133 133 /* Determine IRQ number. */ 134 inum = s3c24xx_irqc_inum_get(>a02_irqc); 135 136 /* Clear interrupt condition in the interrupt controller. */ 137 s3c24xx_irqc_clear(>a02_irqc, inum); 134 inum = pio_read_32(>a02_irqc->intoffset); 138 135 139 136 irq_t *irq = irq_dispatch_and_lock(inum); … … 147 144 CPU->id, inum); 148 145 } 146 147 /* Clear interrupt condition in the interrupt controller. */ 148 pio_write_32(>a02_irqc->srcpnd, S3C24XX_INT_BIT(inum)); 149 pio_write_32(>a02_irqc->intpnd, S3C24XX_INT_BIT(inum)); 149 150 } 150 151 … … 175 176 } 176 177 #endif 177 178 /* Initialize serial port of the debugging console. */ 179 s3c24xx_uart_io_t *scons_io; 180 181 scons_io = (void *) hw_map(GTA02_SCONS_BASE, PAGE_SIZE); 182 gta02_scons_dev = s3c24xx_uart_init(scons_io, S3C24XX_INT_UART2); 183 184 if (gta02_scons_dev) { 185 /* Create output device. */ 186 stdout_wire(gta02_scons_dev); 187 } 188 189 /* 190 * This is the necessary evil until the userspace driver is entirely 191 * self-sufficient. 192 */ 193 sysinfo_set_item_val("s3c24xx_uart", NULL, true); 194 sysinfo_set_item_val("s3c24xx_uart.inr", NULL, S3C24XX_INT_UART2); 195 sysinfo_set_item_val("s3c24xx_uart.address.physical", NULL, 196 (uintptr_t) GTA02_SCONS_BASE); 197 178 outdev_t *scons_dev; 179 180 scons_dev = s3c24xx_uart_init((ioport8_t *) gta02_scons_out); 181 if (scons_dev) 182 stdout_wire(scons_dev); 198 183 } 199 184 200 185 static void gta02_input_init(void) 201 186 { 202 s3c24xx_uart_t *scons_inst;203 204 if (gta02_scons_dev) {205 /* Create input device. */206 scons_inst = (void *) gta02_scons_dev->data;207 208 srln_instance_t *srln_instance = srln_init();209 if (srln_instance) {210 indev_t *sink = stdin_wire();211 indev_t *srln = srln_wire(srln_instance, sink);212 s3c24xx_uart_input_wire(scons_inst, srln);213 214 /* Enable interrupts from UART2 */215 s3c24xx_irqc_src_enable(>a02_irqc,216 S3C24XX_INT_UART2);217 218 /* Enable interrupts from UART2 RXD */219 s3c24xx_irqc_subsrc_enable(>a02_irqc,220 S3C24XX_SUBINT_RXD2);221 }222 }223 }224 225 size_t gta02_get_irq_count(void)226 {227 return GTA02_IRQ_COUNT;228 187 } 229 188 … … 289 248 290 249 /* Enable interrupts from timer0 */ 291 s3c24xx_irqc_src_enable(>a02_irqc, S3C24XX_INT_TIMER0); 250 pio_write_32(>a02_irqc->intmsk, pio_read_32(>a02_irqc->intmsk) & 251 ~S3C24XX_INT_BIT(S3C24XX_INT_TIMER0)); 292 252 293 253 /* Load data from tcntb0/tcmpb0 into tcnt0/tcmp0. */ -
kernel/arch/arm32/src/mach/integratorcp/integratorcp.c
r571addd r5a9f4d7 64 64 icp_frame_init, 65 65 icp_output_init, 66 icp_input_init, 67 icp_get_irq_count 66 icp_input_init 68 67 }; 69 68 … … 337 336 } 338 337 339 size_t icp_get_irq_count(void)340 {341 return ICP_IRQ_COUNT;342 }343 338 344 339 /** @} -
kernel/arch/arm32/src/mach/testarm/testarm.c
r571addd r5a9f4d7 64 64 gxemul_frame_init, 65 65 gxemul_output_init, 66 gxemul_input_init, 67 gxemul_get_irq_count 66 gxemul_input_init 68 67 }; 69 68 … … 127 126 } 128 127 129 size_t gxemul_get_irq_count(void)130 {131 return GXEMUL_IRQ_COUNT;132 }133 134 128 /** Starts gxemul Real Time Clock device, which asserts regular interrupts. 135 129 * -
kernel/arch/arm32/src/machine_func.c
r571addd r5a9f4d7 128 128 size_t machine_get_irq_count(void) 129 129 { 130 return (machine_ops->machine_get_irq_count)(); 130 size_t irq_count; 131 132 #if defined(MACHINE_gta02) 133 irq_count = GTA02_IRQ_COUNT; 134 #elif defined(MACHINE_testarm) 135 irq_count = GXEMUL_IRQ_COUNT; 136 #elif defined(MACHINE_integratorcp) 137 irq_count = ICP_IRQ_COUNT; 138 #else 139 #error Machine type not defined. 140 #endif 141 return irq_count; 131 142 } 132 143 -
kernel/genarch/Makefile.inc
r571addd r5a9f4d7 90 90 endif 91 91 92 ifeq ($(CONFIG_S3C24XX_IRQC),y)93 GENARCH_SOURCES += \94 genarch/src/drivers/s3c24xx_irqc/s3c24xx_irqc.c95 endif96 97 92 ifeq ($(CONFIG_S3C24XX_UART),y) 98 93 GENARCH_SOURCES += \ -
kernel/genarch/include/drivers/s3c24xx_irqc/s3c24xx_irqc.h
r571addd r5a9f4d7 53 53 ioport32_t subsrcpnd; /**< Sub source pending */ 54 54 ioport32_t intsubmsk; /** Interrupt sub mask */ 55 } s3c24xx_irqc_ regs_t;55 } s3c24xx_irqc_t; 56 56 57 57 /** S3C24xx Interrupt source numbers. … … 120 120 #define S3C24XX_SUBINT_BIT(subsource) (1 << (subsource)) 121 121 122 typedef struct {123 s3c24xx_irqc_regs_t *regs;124 } s3c24xx_irqc_t;125 126 extern void s3c24xx_irqc_init(s3c24xx_irqc_t *, s3c24xx_irqc_regs_t *);127 extern unsigned s3c24xx_irqc_inum_get(s3c24xx_irqc_t *);128 extern void s3c24xx_irqc_clear(s3c24xx_irqc_t *, unsigned);129 extern void s3c24xx_irqc_src_enable(s3c24xx_irqc_t *, unsigned);130 extern void s3c24xx_irqc_src_disable(s3c24xx_irqc_t *, unsigned);131 extern void s3c24xx_irqc_subsrc_enable(s3c24xx_irqc_t *, unsigned);132 extern void s3c24xx_irqc_subsrc_disable(s3c24xx_irqc_t *, unsigned);133 134 122 #endif 135 123 -
kernel/genarch/include/drivers/s3c24xx_uart/s3c24xx_uart.h
r571addd r5a9f4d7 38 38 #define KERN_S3C24XX_UART_H_ 39 39 40 #include < ddi/irq.h>40 #include <typedefs.h> 41 41 #include <console/chardev.h> 42 #include <typedefs.h>43 42 44 /** S3C24xx UART I/O */ 45 typedef struct { 46 uint32_t ulcon; 47 uint32_t ucon; 48 uint32_t ufcon; 49 uint32_t umcon; 50 51 uint32_t utrstat; 52 uint32_t uerstat; 53 uint32_t ufstat; 54 uint32_t umstat; 55 56 uint32_t utxh; 57 uint32_t urxh; 58 59 uint32_t ubrdiv; 60 } s3c24xx_uart_io_t; 61 62 /** S3C24xx UART instance */ 63 typedef struct { 64 s3c24xx_uart_io_t *io; 65 indev_t *indev; 66 irq_t irq; 67 } s3c24xx_uart_t; 68 69 extern outdev_t *s3c24xx_uart_init(s3c24xx_uart_io_t *, inr_t inr); 70 extern void s3c24xx_uart_input_wire(s3c24xx_uart_t *, 71 indev_t *); 43 extern outdev_t *s3c24xx_uart_init(ioport8_t *); 72 44 73 45 #endif -
kernel/genarch/src/drivers/s3c24xx_uart/s3c24xx_uart.c
r571addd r5a9f4d7 40 40 #include <genarch/drivers/s3c24xx_uart/s3c24xx_uart.h> 41 41 #include <console/chardev.h> 42 #include <console/console.h>43 #include <ddi/device.h>44 42 #include <arch/asm.h> 45 43 #include <mm/slab.h> 44 #include <console/console.h> 46 45 #include <sysinfo/sysinfo.h> 47 46 #include <str.h> 48 47 49 /* Bits in UTRSTAT register*/50 #define S3C24XX_UTRSTAT _TX_EMPTY 0x451 #define S3C24XX_UT RSTAT_RDATA 0x148 /** S3C24xx UART register offsets */ 49 #define S3C24XX_UTRSTAT 0x10 50 #define S3C24XX_UTXH 0x20 52 51 53 #define S3C24XX_UFSTAT_TX_FULL 0x4000 54 #define S3C24XX_UFSTAT_RX_FULL 0x0040 55 #define S3C24XX_UFSTAT_RX_COUNT 0x002f 52 /* Bits in UTXH register */ 53 #define S3C24XX_UTXH_TX_EMPTY 0x4 54 55 typedef struct { 56 ioport8_t *base; 57 } s3c24xx_uart_instance_t; 56 58 57 59 static void s3c24xx_uart_sendb(outdev_t *dev, uint8_t byte) 58 60 { 59 s3c24xx_uart_t *uart = 60 (s3c24xx_uart_t *) dev->data; 61 s3c24xx_uart_instance_t *instance = 62 (s3c24xx_uart_instance_t *) dev->data; 63 ioport32_t *utrstat, *utxh; 61 64 62 /* Wait for space becoming available in Tx FIFO. */ 63 while ((pio_read_32(&uart->io->ufstat) & S3C24XX_UFSTAT_TX_FULL) != 0) 65 utrstat = (ioport32_t *) (instance->base + S3C24XX_UTRSTAT); 66 utxh = (ioport32_t *) (instance->base + S3C24XX_UTXH); 67 68 /* Wait for transmitter to be empty. */ 69 while ((pio_read_32(utrstat) & S3C24XX_UTXH_TX_EMPTY) == 0) 64 70 ; 65 71 66 pio_write_32( &uart->io->utxh, byte);72 pio_write_32(utxh, byte); 67 73 } 68 74 … … 80 86 } 81 87 82 static irq_ownership_t s3c24xx_uart_claim(irq_t *irq)83 {84 return IRQ_ACCEPT;85 }86 87 static void s3c24xx_uart_irq_handler(irq_t *irq)88 {89 s3c24xx_uart_t *uart = irq->instance;90 91 while ((pio_read_32(&uart->io->ufstat) & S3C24XX_UFSTAT_RX_COUNT) != 0) {92 uint32_t data = pio_read_32(&uart->io->urxh);93 pio_read_32(&uart->io->uerstat);94 indev_push_character(uart->indev, data & 0xff);95 }96 }97 98 88 static outdev_operations_t s3c24xx_uart_ops = { 99 89 .write = s3c24xx_uart_putchar, … … 101 91 }; 102 92 103 outdev_t *s3c24xx_uart_init( s3c24xx_uart_io_t *io, inr_t inr)93 outdev_t *s3c24xx_uart_init(ioport8_t *base) 104 94 { 105 95 outdev_t *uart_dev = malloc(sizeof(outdev_t), FRAME_ATOMIC); … … 107 97 return NULL; 108 98 109 s3c24xx_uart_ t *uart=110 malloc(sizeof(s3c24xx_uart_ t), FRAME_ATOMIC);111 if (! uart) {99 s3c24xx_uart_instance_t *instance = 100 malloc(sizeof(s3c24xx_uart_instance_t), FRAME_ATOMIC); 101 if (!instance) { 112 102 free(uart_dev); 113 103 return NULL; … … 115 105 116 106 outdev_initialize("s3c24xx_uart_dev", uart_dev, &s3c24xx_uart_ops); 117 uart_dev->data = uart;107 uart_dev->data = instance; 118 108 119 uart->io = io; 120 uart->indev = NULL; 121 122 /* Initialize IRQ structure. */ 123 irq_initialize(&uart->irq); 124 uart->irq.devno = device_assign_devno(); 125 uart->irq.inr = inr; 126 uart->irq.claim = s3c24xx_uart_claim; 127 uart->irq.handler = s3c24xx_uart_irq_handler; 128 uart->irq.instance = uart; 129 130 /* Enable FIFO, Tx trigger level: empty, Rx trigger level: 1 byte. */ 131 pio_write_32(&uart->io->ufcon, 0x01); 132 133 /* Set RX interrupt to pulse mode */ 134 pio_write_32(&uart->io->ucon, 135 pio_read_32(&uart->io->ucon) & ~(1 << 8)); 109 instance->base = base; 136 110 137 111 if (!fb_exported) { … … 142 116 sysinfo_set_item_val("fb", NULL, true); 143 117 sysinfo_set_item_val("fb.kind", NULL, 3); 144 sysinfo_set_item_val("fb.address.physical", NULL, KA2PA( io));118 sysinfo_set_item_val("fb.address.physical", NULL, KA2PA(base)); 145 119 146 120 fb_exported = true; … … 150 124 } 151 125 152 void s3c24xx_uart_input_wire(s3c24xx_uart_t *uart, indev_t *indev)153 {154 ASSERT(uart);155 ASSERT(indev);156 157 uart->indev = indev;158 irq_register(&uart->irq);159 }160 161 126 /** @} 162 127 */ -
uspace/Makefile
r571addd r5a9f4d7 69 69 srv/hid/kbd \ 70 70 srv/hw/char/i8042 \ 71 srv/hw/char/s3c24xx_uart \72 71 srv/hw/netif/dp8390 \ 73 72 srv/net/cfg \ -
uspace/app/init/init.c
r571addd r5a9f4d7 274 274 srv_start("/srv/cuda_adb"); 275 275 srv_start("/srv/i8042"); 276 srv_start("/srv/s3c24ser");277 276 srv_start("/srv/adb_ms"); 278 277 srv_start("/srv/char_ms"); -
uspace/srv/hid/kbd/Makefile
r571addd r5a9f4d7 60 60 ifeq ($(MACHINE),gta02) 61 61 SOURCES += \ 62 port/ chardev.c \63 ctl/ stty.c62 port/dummy.c \ 63 ctl/pc.c 64 64 endif 65 65 ifeq ($(MACHINE),testarm) -
uspace/srv/hid/kbd/port/chardev.c
r571addd r5a9f4d7 41 41 #include <kbd.h> 42 42 #include <vfs/vfs.h> 43 #include <sys/stat.h>44 43 #include <fcntl.h> 45 44 #include <errno.h> … … 51 50 #define NAME "kbd" 52 51 53 /** List of devices to try connecting to. */54 static const char *in_devs[] = {55 "/dev/char/ps2a",56 "/dev/char/s3c24ser"57 };58 59 static const int num_devs = sizeof(in_devs) / sizeof(in_devs[0]);60 61 52 int kbd_port_init(void) 62 53 { 54 const char *input = "/dev/char/ps2a"; 63 55 int input_fd; 64 int i;65 56 66 input_fd = -1; 67 for (i = 0; i < num_devs; i++) { 68 struct stat s; 57 printf(NAME ": open %s\n", input); 69 58 70 if (stat(in_devs[i], &s) == EOK) 71 break; 72 } 73 74 if (i >= num_devs) { 75 printf(NAME ": Could not find any suitable input device.\n"); 76 return -1; 77 } 78 79 input_fd = open(in_devs[i], O_RDONLY); 59 input_fd = open(input, O_RDONLY); 80 60 if (input_fd < 0) { 81 printf(NAME ": failed opening device %s (%d).\n", in_devs[i], 82 input_fd); 83 return -1; 61 printf(NAME ": Failed opening %s (%d)\n", input, input_fd); 62 return false; 84 63 } 85 64 86 65 dev_phone = fd_phone(input_fd); 87 66 if (dev_phone < 0) { 88 printf(NAME ": Failed connectingto device\n");89 return -1;67 printf(NAME ": Failed to connect to device\n"); 68 return false; 90 69 } 91 70 … … 94 73 if (ipc_connect_to_me(dev_phone, 0, 0, 0, &phonehash) != 0) { 95 74 printf(NAME ": Failed to create callback from device\n"); 96 return -1;75 return false; 97 76 } 98 77
Note:
See TracChangeset
for help on using the changeset viewer.