Changeset 75fe97b in mainline
- Timestamp:
- 2014-09-03T10:52:10Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 95b2276
- Parents:
- b3222a3
- Files:
-
- 4 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/arm32/Makefile.inc
rb3222a3 r75fe97b 75 75 char/pl050 \ 76 76 char/xtkbd \ 77 char/ps2mouse \ 77 78 platform/icp 79 RD_SRVS_ESSENTIAL += \ 80 $(USPACE_PATH)/srv/hw/irc/icp-ic/icp-ic 78 81 endif 79 82 -
uspace/Makefile
rb3222a3 r75fe97b 196 196 DIRS += \ 197 197 drv/platform/amdm37x \ 198 drv/fb/amdm37x_dispc 198 drv/fb/amdm37x_dispc \ 199 srv/hw/irc/icp-ic 199 200 endif 200 201 -
uspace/app/init/init.c
rb3222a3 r75fe97b 331 331 srv_start("/srv/apic"); 332 332 srv_start("/srv/i8259"); 333 srv_start("/srv/icp-ic"); 333 334 srv_start("/srv/obio"); 334 335 srv_start("/srv/cuda_adb"); -
uspace/drv/char/pl050/pl050.c
rb3222a3 r75fe97b 32 32 33 33 #include <assert.h> 34 #include <bitops.h> 34 35 #include <stdio.h> 35 36 #include <errno.h> … … 39 40 #include <device/hw_res_parsed.h> 40 41 #include <io/chardev_srv.h> 42 #include <irc.h> 43 44 #include "pl050_hw.h" 41 45 42 46 #define NAME "pl050" 43 44 #define PL050_STAT 445 #define PL050_DATA 846 47 #define PL050_STAT_RXFULL (1 << 4)48 47 49 48 enum { … … 77 76 async_sess_t *parent_sess; 78 77 ddf_dev_t *dev; 78 char *name; 79 79 80 80 ddf_fun_t *fun_a; … … 83 83 uintptr_t iobase; 84 84 size_t iosize; 85 kmi_regs_t *regs; 85 86 uint8_t buffer[buffer_size]; 86 87 size_t buf_rp; … … 105 106 { 106 107 .cmd = CMD_AND, 107 .value = PL050_STAT_RXFULL,108 .value = BIT_V(uint8_t, kmi_stat_rxfull), 108 109 .srcarg = 1, 109 110 .dstarg = 3 … … 159 160 { 160 161 hw_res_list_parsed_t res; 162 void *regs; 161 163 int rc; 162 164 … … 190 192 191 193 pl050_irq_code.ranges[0].base = pl050->iobase; 192 pl050_irq_code.cmds[0].addr = (void *) pl050->iobase + PL050_STAT; 193 pl050_irq_code.cmds[3].addr = (void *) pl050->iobase + PL050_DATA; 194 kmi_regs_t *regsphys = (kmi_regs_t *) pl050->iobase; 195 pl050_irq_code.cmds[0].addr = ®sphys->stat; 196 pl050_irq_code.cmds[3].addr = ®sphys->data; 194 197 195 198 if (res.irqs.count != 1) { … … 202 205 res.irqs.irqs[0]); 203 206 207 rc = pio_enable((void *)pl050->iobase, sizeof(kmi_regs_t), ®s); 208 if (rc != EOK) { 209 ddf_msg(LVL_ERROR, "Error enabling PIO"); 210 goto error; 211 } 212 213 pl050->regs = regs; 214 204 215 rc = register_interrupt_handler(pl050->dev, res.irqs.irqs[0], 205 216 pl050_interrupt, &pl050_irq_code); … … 209 220 goto error; 210 221 } 222 223 rc = irc_enable_interrupt(res.irqs.irqs[0]); 224 if (rc != EOK) { 225 ddf_msg(LVL_ERROR, "Failed enabling interrupt. (%d)", rc); 226 goto error; 227 } 228 229 pio_write_8(&pl050->regs->cr, 230 BIT_V(uint8_t, kmi_cr_enable) | 231 BIT_V(uint8_t, kmi_cr_rxintr)); 211 232 212 233 return EOK; … … 220 241 uint8_t *bp = buffer; 221 242 size_t left; 243 222 244 fibril_mutex_lock(&pl050->buf_lock); 223 245 … … 238 260 static int pl050_write(chardev_srv_t *srv, const void *data, size_t size) 239 261 { 262 pl050_t *pl050 = (pl050_t *)srv->srvs->sarg; 263 uint8_t *dp = (uint8_t *)data; 264 uint8_t status; 265 size_t i; 266 267 ddf_msg(LVL_NOTE, "%s/pl050_write(%zu bytes)", pl050->name, size); 268 for (i = 0; i < size; i++) { 269 while (true) { 270 status = pio_read_8(&pl050->regs->stat); 271 if ((status & BIT_V(uint8_t, kmi_stat_txempty)) != 0) 272 break; 273 } 274 pio_write_8(&pl050->regs->data, dp[i]); 275 } 276 ddf_msg(LVL_NOTE, "%s/pl050_write() success", pl050->name); 277 240 278 return size; 241 279 } … … 252 290 { 253 291 ddf_fun_t *fun_a; 254 pl050_t *pl050; 292 pl050_t *pl050 = NULL; 293 const char *mname; 255 294 int rc; 256 295 … … 264 303 } 265 304 305 pl050->name = (char *)ddf_dev_get_name(dev); 306 if (pl050->name == NULL) { 307 rc = ENOMEM; 308 goto error; 309 } 310 266 311 fun_a = ddf_fun_create(dev, fun_inner, "a"); 267 312 if (fun_a == NULL) { … … 278 323 goto error; 279 324 280 rc = ddf_fun_add_match_id(fun_a, "char/xtkbd", 10); 325 if (str_cmp(pl050->name, "kbd") == 0) 326 mname = "char/xtkbd"; 327 else 328 mname = "char/ps2mouse"; 329 330 rc = ddf_fun_add_match_id(fun_a, mname, 10); 281 331 if (rc != EOK) { 282 332 ddf_msg(LVL_ERROR, "Failed adding match IDs to function %s", … … 284 334 goto error; 285 335 } 286 287 336 288 337 chardev_srvs_init(&pl050->cds); … … 302 351 return EOK; 303 352 error: 353 if (pl050 != NULL) 354 free(pl050->name); 304 355 return rc; 305 356 } -
uspace/drv/platform/icp/icp.c
rb3222a3 r75fe97b 51 51 enum { 52 52 icp_kbd_base = 0x18000000, 53 icp_kbd_irq = 3 53 icp_kbd_irq = 3, 54 icp_mouse_base = 0x19000000, 55 icp_mouse_irq = 4 54 56 }; 55 57 … … 69 71 }; 70 72 71 static hw_resource_t icp_ pl050_res[] = {73 static hw_resource_t icp_kbd_res[] = { 72 74 { 73 75 .type = MEM_RANGE, … … 87 89 }; 88 90 91 static hw_resource_t icp_mouse_res[] = { 92 { 93 .type = MEM_RANGE, 94 .res.mem_range = { 95 .address = icp_mouse_base, 96 .size = 9, 97 .relative = false, 98 .endianness = LITTLE_ENDIAN 99 } 100 }, 101 { 102 .type = INTERRUPT, 103 .res.interrupt = { 104 .irq = icp_mouse_irq 105 } 106 } 107 }; 108 89 109 static pio_window_t icp_pio_window = { 90 110 .mem = { … … 94 114 }; 95 115 96 static icp_fun_t icp_ pl050_fun_proto = {116 static icp_fun_t icp_kbd_fun_proto = { 97 117 .hw_resources = { 98 sizeof(icp_pl050_res) / sizeof(icp_pl050_res[0]), 99 icp_pl050_res 118 sizeof(icp_kbd_res) / sizeof(icp_kbd_res[0]), 119 icp_kbd_res 120 }, 121 }; 122 123 static icp_fun_t icp_mouse_fun_proto = { 124 .hw_resources = { 125 sizeof(icp_mouse_res) / sizeof(icp_mouse_res[0]), 126 icp_mouse_res 100 127 }, 101 128 }; … … 188 215 static int icp_add_functions(ddf_dev_t *dev) 189 216 { 190 return icp_add_fun(dev, "pl050", "arm/pl050", &icp_pl050_fun_proto); 217 int rc; 218 219 rc = icp_add_fun(dev, "kbd", "arm/pl050", &icp_kbd_fun_proto); 220 if (rc != EOK) 221 return rc; 222 223 rc = icp_add_fun(dev, "mouse", "arm/pl050", &icp_mouse_fun_proto); 224 if (rc != EOK) 225 return rc; 226 227 return EOK; 191 228 } 192 229 -
uspace/lib/c/generic/irc.c
rb3222a3 r75fe97b 49 49 static int irc_init(void) 50 50 { 51 sysarg_t apic;52 sysarg_t i8259;53 54 51 assert(irc_sess == NULL); 55 52 56 if (((sysinfo_get_value("apic", &apic) == EOK) && (apic)) 57 || ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259))) { 58 irc_sess = service_connect_blocking(EXCHANGE_SERIALIZE, 59 SERVICE_IRC, 0, 0); 60 } 53 irc_sess = service_connect_blocking(EXCHANGE_SERIALIZE, 54 SERVICE_IRC, 0, 0); 61 55 62 56 if (irc_sess == NULL)
Note:
See TracChangeset
for help on using the changeset viewer.