一、binder_call
int binder_call(struct binder_state *bs,
struct binder_io *msg, struct binder_io *reply,
uint32_t target, uint32_t code);
实现远程调用RPC,既然是远程函数调用,那么就有如下要素:
-
向谁发送数据:target
-
调用哪个函数:code
-
提供什么参数:msg
-
返回值:reply
如何使用?
- 构造参数:存放在buf中,用binder_io结构体描述
struct binder_io { char *data; /* pointer to read/write from */ binder_size_t *offs; /* array of offsets */ size_t data_avail; /* bytes available in data buffer */ size_t offs_avail; /* entries available in offsets array */ char *data0; /* start of data buffer */ binder_size_t *offs0; /* start of offsets buffer */ uint32_t flags; uint32_t unused; };
- 数据格式转换,将binder_io数据转换成驱动程序要求的binder_write_read数据
- 调用ioctl发送数据--ioctl(bs->fd, BINDER_WRITE_READ, &bwr);
struct binder_write_read {
binder_size_t write_size;
binder_size_t write_consumed;
binder_uintptr_t write_buffer;
/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */
binder_size_t read_size;
binder_size_t read_consumed;
binder_uintptr_t read_buffer;
};
- 调用ioctl接收数据--ioctl(bs->fd, BINDER_WRITE_READ, &bwr);