#define ISO_HANDLE 257
#define SCO_HANDLE 257
-#define DEBUGFS_PATH "/sys/kernel/debug/bluetooth"
-
struct hook {
btdev_hook_func handler;
void *user_data;
uint8_t le_states[8];
const struct btdev_cmd *cmds;
uint16_t msft_opcode;
+ bool aosp_capable;
uint16_t default_link_policy;
uint8_t event_mask[8];
return false;
}
+
+int btdev_set_msft_opcode(struct btdev *btdev, uint16_t opcode)
+{
+ if (!btdev)
+ return -EINVAL;
+
+ btdev->msft_opcode = opcode;
+
+ return 0;
+}
+
+int btdev_set_aosp_capable(struct btdev *btdev, bool enable)
+{
+ if (!btdev)
+ return -EINVAL;
+
+ btdev->aosp_capable = enable;
+
+ return 0;
+}
#include <stdlib.h>
#include <string.h>
#include <sys/uio.h>
+#include <fcntl.h>
+#include <unistd.h>
#include "lib/bluetooth.h"
#include "lib/hci.h"
#include "btdev.h"
#include "vhci.h"
+#define DEBUGFS_PATH "/sys/kernel/debug/bluetooth"
+
struct vhci {
enum btdev_type type;
+ uint16_t index;
struct io *io;
struct btdev *btdev;
};
memset(vhci, 0, sizeof(*vhci));
vhci->type = type;
+ vhci->index = rsp.index;
vhci->io = io_new(fd);
io_set_close_on_destroy(vhci->io, true);
return vhci->btdev;
}
+
+static int vhci_debugfs_write(struct vhci *vhci, char *option, void *data,
+ size_t len)
+{
+ char path[64];
+ int fd, err;
+ size_t n;
+
+ if (!vhci)
+ return -EINVAL;
+
+ memset(path, 0, sizeof(path));
+ sprintf(path, DEBUGFS_PATH "/hci%d/%s", vhci->index, option);
+
+ fd = open(path, O_RDWR);
+ if (fd < 0)
+ return -errno;
+
+ n = write(fd, data, len);
+ if (n == len)
+ err = 0;
+ else
+ err = -errno;
+
+ close(fd);
+
+ return err;
+}
+
+int vhci_set_force_suspend(struct vhci *vhci, bool enable)
+{
+ char val;
+
+ val = (enable) ? 'Y' : 'N';
+
+ return vhci_debugfs_write(vhci, "force_suspend", &val, sizeof(val));
+}
+
+int vhci_set_force_wakeup(struct vhci *vhci, bool enable)
+{
+ char val;
+
+ val = (enable) ? 'Y' : 'N';
+
+ return vhci_debugfs_write(vhci, "force_wakeup", &val, sizeof(val));
+}
+
+int vhci_set_msft_opcode(struct vhci *vhci, uint16_t opcode)
+{
+ return vhci_debugfs_write(vhci, "msft_opcode", &opcode, sizeof(opcode));
+}
+
+int vhci_set_aosp_capable(struct vhci *vhci, bool enable)
+{
+ char val;
+
+ val = (enable) ? 'Y' : 'N';
+
+ return vhci_debugfs_write(vhci, "aosp_capable", &val, sizeof(val));
+}
void vhci_close(struct vhci *vhci);
struct btdev *vhci_get_btdev(struct vhci *vhci);
+
+int vhci_set_force_suspend(struct vhci *vhci, bool enable);
+int vhci_set_force_wakeup(struct vhci *vhci, bool enable);
+int vhci_set_msft_opcode(struct vhci *vhci, uint16_t opcode);
+int vhci_set_aosp_capable(struct vhci *vhci, bool enable);