Changeset 75fe97b in mainline for uspace/drv/char/pl050/pl050.c
- 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
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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 }
Note:
See TracChangeset
for help on using the changeset viewer.