diff --git a/src/chatpad.cpp b/src/chatpad.cpp index ce2bf9b..3e880e5 100644 --- a/src/chatpad.cpp +++ b/src/chatpad.cpp @@ -25,13 +25,19 @@ #include "linux_uinput.hpp" -Chatpad::Chatpad(struct usb_dev_handle* handle) : +Chatpad::Chatpad(struct usb_dev_handle* handle, uint16_t bcdDevice) : m_handle(handle), + m_bcdDevice(bcdDevice), m_quit_thread(false), m_read_thread(), m_keep_alive_thread(), m_led_state(0) { + if (m_bcdDevice != 0x0110 && m_bcdDevice != 0x0114) + { + throw std::runtime_error("unknown bcdDevice version number, please report this issue to grumbel@gmail.com and include the output of 'lsusb -v'"); + } + memset(m_keymap, 0, 256); memset(m_state, 0, 256); @@ -183,7 +189,7 @@ Chatpad::read_thread() } else { - if (true) + if (false) { std::cout << "read: " << len << "/5: data: " << std::flush; for(int i = 0; i < len; ++i) @@ -281,18 +287,17 @@ Chatpad::send_init() // these three will fail, but are necessary to have the later ones succeed ret = usb_control_msg(m_handle, 0x40, 0xa9, 0xa30c, 0x4423, NULL, 0, 0); - std::cout << "ret: " << ret << std::endl; + //std::cout << "ret: " << ret << std::endl; ret = usb_control_msg(m_handle, 0x40, 0xa9, 0x2344, 0x7f03, NULL, 0, 0); - std::cout << "ret: " << ret << std::endl; + //std::cout << "ret: " << ret << std::endl; ret = usb_control_msg(m_handle, 0x40, 0xa9, 0x5839, 0x6832, NULL, 0, 0); - std::cout << "ret: " << ret << std::endl; - + //std::cout << "ret: " << ret << std::endl; // make chatpad ready ret = usb_control_msg(m_handle, 0xc0, 0xa1, 0x0000, 0xe416, buf, 2, 0); // (read 2 bytes, will return a mode) - std::cout << "ret: " << ret << " " << (int)buf[0] << " " << (int)buf[1]<< std::endl; + //std::cout << "ret: " << ret << " " << (int)buf[0] << " " << (int)buf[1]<< std::endl; if (buf[1] & 2) { @@ -300,22 +305,26 @@ Chatpad::send_init() } else { - if (true /* old_xbox360 pad */) + if (m_bcdDevice == 0x0110) { buf[0] = 0x01; buf[1] = 0x02; } - else + else if (m_bcdDevice == 0x0114) { buf[0] = 0x09; buf[1] = 0x00; } + else + { + assert(!"never reached"); + } ret = usb_control_msg(m_handle, 0x40, 0xa1, 0x0000, 0xe416, buf, 2, 0); // (send 2 bytes, data must be 0x09 0x00) - std::cout << "ret: " << ret << std::endl; + //std::cout << "ret: " << ret << std::endl; ret = usb_control_msg(m_handle, 0xc0, 0xa1, 0x0000, 0xe416, buf, 2, 0); // (read 2 bytes, this should return the NEW mode) - std::cout << "ret: " << ret << " " << (int)buf[0] << " " << (int)buf[1]<< std::endl; + //std::cout << "ret: " << ret << " " << (int)buf[0] << " " << (int)buf[1]<< std::endl; if (!(buf[1] & 2)) { @@ -326,11 +335,11 @@ Chatpad::send_init() // only when we get "01 02" back is the chatpad ready usb_control_msg(m_handle, 0x41, 0x0, 0x1f, 0x02, 0, NULL, 0); - std::cout << "0x1f" << std::endl; + //std::cout << "0x1f" << std::endl; sleep(1); usb_control_msg(m_handle, 0x41, 0x0, 0x1e, 0x02, 0, NULL, 0); - std::cout << "0x1e" << std::endl; + //std::cout << "0x1e" << std::endl; // can't send 1b before 1f before one rotation usb_control_msg(m_handle, 0x41, 0x0, 0x1b, 0x02, 0, NULL, 0); diff --git a/src/chatpad.hpp b/src/chatpad.hpp index 43d4853..330df3b 100644 --- a/src/chatpad.hpp +++ b/src/chatpad.hpp @@ -127,6 +127,7 @@ private: private: struct usb_dev_handle* m_handle; + uint16_t m_bcdDevice; bool m_quit_thread; std::auto_ptr<boost::thread> m_read_thread; std::auto_ptr<boost::thread> m_keep_alive_thread; @@ -136,7 +137,7 @@ private: unsigned int m_led_state; public: - Chatpad(struct usb_dev_handle* handle); + Chatpad(struct usb_dev_handle* handle, uint16_t bcdDevice); ~Chatpad(); void send_init(); diff --git a/src/xbox360_controller.cpp b/src/xbox360_controller.cpp index 9685a0c..565855b 100644 --- a/src/xbox360_controller.cpp +++ b/src/xbox360_controller.cpp @@ -105,7 +105,7 @@ Xbox360Controller::Xbox360Controller(struct usb_device* dev_, bool chatpad, bool if (chatpad) { - m_chatpad.reset(new Chatpad(handle)); + m_chatpad.reset(new Chatpad(handle, dev->descriptor.bcdDevice)); m_chatpad->send_init(); m_chatpad->start_threads(); }