Changeset 75751db6 in mainline for uspace/drv/char/pl050/pl050.c
- Timestamp:
- 2014-08-29T20:32:20Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- af0a2c7
- Parents:
- 312e5ff
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/char/pl050/pl050.c
r312e5ff r75751db6 38 38 #include <ddf/log.h> 39 39 #include <device/hw_res_parsed.h> 40 #include <io/chardev_srv.h> 40 41 41 42 #define NAME "pl050" … … 45 46 46 47 #define PL050_STAT_RXFULL (1 << 4) 47 48 enum {49 IPC_CHAR_READ = DEV_FIRST_CUSTOM_METHOD,50 IPC_CHAR_WRITE,51 };52 48 53 49 enum { … … 59 55 static int pl050_fun_offline(ddf_fun_t *); 60 56 static void pl050_char_conn(ipc_callid_t, ipc_call_t *, void *); 57 static int pl050_read(chardev_srv_t *, void *, size_t); 58 static int pl050_write(chardev_srv_t *, const void *, size_t); 61 59 62 60 static driver_ops_t driver_ops = { … … 71 69 }; 72 70 71 static chardev_ops_t pl050_chardev_ops = { 72 .read = pl050_read, 73 .write = pl050_write 74 }; 75 73 76 typedef struct { 77 async_sess_t *parent_sess; 74 78 ddf_dev_t *dev; 79 75 80 ddf_fun_t *fun_a; 76 async_sess_t *parent_sess; 81 chardev_srvs_t cds; 82 77 83 uintptr_t iobase; 78 84 size_t iosize; … … 135 141 size_t nidx; 136 142 143 ddf_msg(LVL_NOTE, "Interrupt"); 144 137 145 fibril_mutex_lock(&pl050->buf_lock); 138 146 nidx = (pl050->buf_wp + 1) % buffer_size; … … 209 217 } 210 218 211 static int pl050_read(pl050_t *pl050, void *buffer, size_t size) 212 { 219 static int pl050_read(chardev_srv_t *srv, void *buffer, size_t size) 220 { 221 pl050_t *pl050 = (pl050_t *)srv->srvs->sarg; 213 222 uint8_t *bp = buffer; 223 size_t left; 214 224 fibril_mutex_lock(&pl050->buf_lock); 215 225 216 while (size > 0) { 226 left = size; 227 while (left > 0) { 217 228 while (pl050->buf_rp == pl050->buf_wp) 218 229 fibril_condvar_wait(&pl050->buf_cv, &pl050->buf_lock); 219 230 *bp++ = pl050->buffer[pl050->buf_rp]; 220 -- size;231 --left; 221 232 pl050->buf_rp = (pl050->buf_rp + 1) % buffer_size; 222 233 } … … 224 235 fibril_mutex_unlock(&pl050->buf_lock); 225 236 226 return EOK;227 } 228 229 static int pl050_write( pl050_t *pl050,void *data, size_t size)230 { 231 return EOK;237 return size; 238 } 239 240 static int pl050_write(chardev_srv_t *srv, const void *data, size_t size) 241 { 242 return size; 232 243 } 233 244 … … 236 247 pl050_t *pl050 = pl050_from_fun((ddf_fun_t *)arg); 237 248 238 /* Accept the connection */ 239 async_answer_0(iid, EOK); 240 241 while (true) { 242 ipc_call_t call; 243 ipc_callid_t callid = async_get_call(&call); 244 sysarg_t method = IPC_GET_IMETHOD(call); 245 size_t size = IPC_GET_ARG1(call); 246 247 if (!method) { 248 /* The other side has hung up */ 249 async_answer_0(callid, EOK); 250 break; 251 } 252 253 switch (method) { 254 case IPC_CHAR_READ: 255 if (size <= 4 * sizeof(sysarg_t)) { 256 sysarg_t message[4] = {}; 257 258 pl050_read(pl050, (char *) message, size); 259 async_answer_4(callid, size, message[0], message[1], 260 message[2], message[3]); 261 } else 262 async_answer_0(callid, ELIMIT); 263 break; 264 265 case IPC_CHAR_WRITE: 266 if (size <= 3 * sizeof(sysarg_t)) { 267 const sysarg_t message[3] = { 268 IPC_GET_ARG2(call), 269 IPC_GET_ARG3(call), 270 IPC_GET_ARG4(call) 271 }; 272 273 pl050_write(pl050, (char *) message, size); 274 async_answer_0(callid, size); 275 } else 276 async_answer_0(callid, ELIMIT); 277 278 default: 279 async_answer_0(callid, EINVAL); 280 } 281 } 249 chardev_conn(iid, icall, &pl050->cds); 282 250 } 283 251 … … 289 257 int rc; 290 258 291 ddf_msg(LVL_ DEBUG, "pl050_dev_add()");259 ddf_msg(LVL_NOTE, "pl050_dev_add()"); 292 260 293 261 pl050 = ddf_dev_data_alloc(dev, sizeof(pl050_t)); … … 308 276 pl050->dev = dev; 309 277 278 if (1) { 310 279 rc = pl050_init(pl050); 311 280 if (rc != EOK) 312 281 goto error; 313 282 } 314 283 rc = ddf_fun_add_match_id(fun_a, "char/xtkbd", 10); 315 284 if (rc != EOK) { … … 319 288 } 320 289 290 ddf_msg(LVL_NOTE, "Init srvs"); 291 if (1) { 292 chardev_srvs_init(&pl050->cds); 293 pl050->cds.ops = &pl050_chardev_ops; 294 pl050->cds.sarg = pl050; 295 321 296 ddf_fun_set_conn_handler(fun_a, pl050_char_conn); 322 297 } 323 298 rc = ddf_fun_bind(fun_a); 324 299 if (rc != EOK) { … … 328 303 } 329 304 305 ddf_msg(LVL_NOTE, "Device added"); 330 306 ddf_msg(LVL_DEBUG, "Device added."); 331 307 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.