Bữa có viết 1 post về jailbreak, nhưng nó chưa đủ thoả mãn với mình, mục đích jailbreak để làm các trò con bò khác như Remote page turner, chuyển trang, lùi trang cho kindle.
Mình thì có dùng thằng usb otg extension và cắm chân usb của chuột không dây để nó lật trang. Nhưng với chuột không dây thì nó bị to quá và có 1 bạn comment là nó là bút slide. Ôi trời! vậy mà tôi không biết =)))
Và có 1 bác có nick name là kindle hải phòng có comment là nếu dùng bút slide phải cài extension kindlelazy trên kual và nó chỉ hỗ trợ kindle paperwhite 3, mà trong khi đó máy mình là voyage. Vậy nên mình quyết định mua 1 cái bút slide để thử xem sao. Và kết quả là nó không chạy được. Điên mất.
Rồi mình cũng lên trang mobile read để đọc và xem các fix sao thì cũng không hiểu gì lắm vì toàn thuật ngữ đâu đâu. Mình ngó qua github của kindlelazy thì thấy nó cũng có 1 vài thông tin liên quan đến event code. Mình đoán là mỗi máy sẽ có 1 code khác nhau và cần sửa code đó trên extension. Mò đọc code thì cũng không hiểu gì lắm vì nó viết = C.
Mà mình lại không chuyên C, nhưng mà nếu ngồi mò thì chắc cũng dc thôi nhưng mình nghĩ đó không phải là phương án hay. Nên mình có hỏi chatgpt và có liên hệ hỏi tác giả các thứ. Được cái tác giả cũng rất nhiệt tình trả lời mình =))
Sau cùng thì cũng hiểu sơ sơ. Mà thực ra trước khi hỏi tác giả mình cũng phải nghiên cứu lục lọi hết google để làm sao truy cập được vào con kindle qua ssh hoặc qua dây để biết dc nó như nào. Tìm hết mọi thứ, cũng nản, và hơn 1 ngày thì mình tự dưng tìm được 1 cái post của ông hàn hay trung gì đó có hướng dẫn về cách truy cập vào kindle qua ssh. Rồi hỏi tác giả thì biết thêm được chút.
Tạm vậy nên đi vào chi tiết giải thích cách làm như thế nào nhé.
Để truy cập được vào kindle thì chắc chắn là vẫn phải jailbreak trước. sau đó cài extension usbnet cho kindle. Nhưng cái bản jailbreak của mình người ta cài sẵn KUAL có Koreader rồi nên mình chỉ việc vào koreader để mở ssh server ra thôi.
Muốn mở ssh server trên koreader vào koreader chọn settings -> koreader settings -> network -> ssh server -> lúc đầu thì bỏ tick vào cái ssh server để nó tắt, sau đó tick vào cái Login without password => sau đó tick lại SSH server. Vậy là xong.
Khi bạn tick vào SSH server thì nó sẽ show ra 1 cái popup chứa thông tin ip và port để truy cập vào kindle.
Thường ip nó sẽ là 192.168.1.245
Trên máy tính bạn có thể truy cập ssh vào kindle bằng cách mở terminal và gõ lệnh sau:
ssh -p 2222 root@192.168.1.245
nó sẽ hỏi bạn pass, b nhập bừa hoặc enter luôn cũng được. nó sẽ vào được kindle của bạn, vậy là xong 1 bước mở ssh server và truy cập được vào kindle. Bạn có thể thoát ra khỏi cái Koreader và ssh server vẫn chạy.
Sau khi truy cập được vào kindle thì bạn cần tìm hiểu về event input của kindle. Mỗi máy kindle nó sẽ có event input khác nhau. Cái event input này có tác dụng là nhận code từ bút slide và chuyển thành event để kindle hiểu là chuyển trang hoặc lùi trang.
nơi chứa event code bạn có thể chạy lệnh sau:
cd /dev/input/
ls
lúc này nó sẽ list hết ra những event code của kindle.
[root@kindle root]# cd /dev/input/
[root@kindle input]# ls
by-path event0 event1 event2 uinput
sau khi list xong bạn sẽ thấy nó có event 0 đến 2. Bạn có thể test event bằng lệnh: ví dụ event2:
evtest ./event2
nó sẽ ra như sau
[root@kindle input]# evtest ./event2
Input driver version is 1.0.1
Input device ID: bus 0x18 vendor 0x0 product 0x0 version 0x0
Input device name: "fsr_keypad"
Supported events:
Event type 0 (Sync)
Event type 1 (Key)
Event code 104 (PageUp)
Event code 109 (PageDown)
Testing ... (interrupt to exit)
làm thử với các event còn lại để biết nó là gì
[root@kindle input]# evtest ./event1
Input driver version is 1.0.1
Input device ID: bus 0x0 vendor 0x0 product 0x0 version 0x0
Input device name: "cyttsp4_mt"
Supported events:
Event type 0 (Sync)
Event type 1 (Key)
Event code 325 (ToolFinger)
Event code 330 (Touch)
Event code 333 (Tool Doubletap)
Event code 334 (Tool Tripletap)
Event type 2 (Relative)
Event type 3 (Absolute)
Event code 47 (MT Slot)
Value 0
Min 0
Max 2
Event code 53 (MT X)
Value 0
Min 0
Max 1071
Event code 54 (MT Y)
Value 0
Min 0
Max 1447
Event code 57 (MT Tracking ID)
Value 0
Min 0
Max 65535
Testing ... (interrupt to exit)
[root@kindle input]# evtest ./event0
Input driver version is 1.0.1
Input device ID: bus 0x0 vendor 0x0 product 0x0 version 0x0
Input device name: "max77696-onkey"
Supported events:
Event type 0 (Sync)
Event type 1 (Key)
Event code 116 (Power)
Testing ... (interrupt to exit)
Dựa vào các output trên thì các bạn sẽ biết được event nào để chuyển trang hoặc lùi trang. Ví dụ như trường hợp kindle voyage của mình là event2 có event code 104 là PageUp và 109 là PageDown.
Khi nói chuyện với tác giả kindlelazy thì tác giả bảo với máy của anh ấy thì là event khác với máy mình. Vậy nên mình cần phải sửa code của kindlelazy để nó nhận event code của máy mình.
Tác giả bảo cách nhanh nhất là đổi thứ tự đọc event code trong file kindlelazy bằng cách sửa file kindlelazy trong foler bin,
Quote từ tác giả:
so, this small hack might work. It will avoid the error
so, it will read event2 and event0 - they will exist.
Sửa xong copy lại vào kindle và chạy lại kindlelazy.
Có thể chạy lệnh này xem kindlelazy có lỗi gì không ( nhớ cd vào folder kindlelazy trước):
/mnt/us/extensions/KindleLazy/bin/KindleLazy
Và mình thấy nó không có lỗi gì. Nhưng nó vẫn không chuyển được trang từ bút slide. Nên mình lại nghĩ đến việc có thể bút slide không nhận được hoặc không phù hợp với kindle ( tác giả cũng có bảo có thể thử với bút slide khác =)) )
Quote từ tác giả:
it's a strange issue, but, because your wireless mouse works, it should be ok.
I don't want you to buy another usb presentator but... maybe?
Và mình chạy thử lệnh này để check xem có nhận device hay không thì nếu cắm chân usb của chuột không dây thì mình thấy nó có nhận
Nhưng khi cắm bút slide thì mình không thấy nó hiển thị thêm gì ngoài 2 cái đầu nên mình biết là nó không nhận. Vậy nên mình nghĩ là do bút slide không phù hợp với kindle.
Nhưng trong lúc restart kindle thì mình dùng lệnh
reboot
lệnh này của linux thì mình thấy kindle có restart máy. vậy nên mình nghĩ ra 1 idea là sao không gửi luôn lệnh lật trang qua ssh.
Vậy nên cái việc mua bút slide mới với mình không còn hay ho hơn cái idea mới này.
Và mình lên mạng tìm tiếp, đủ mọi cách để làm sao gửi command mà lật được trang. Tìm mãi cũng hơi chán rồi thế quái nào lại được. Về cơ bản nó sẽ như này
Đầu tiên chạy lệnh này ( thay event của máy các bạn, việc tìm event bước trên đã hướng dẫn)
cat /dev/input/event2 | hexdump -C
sau đó trên kindle bấm chuyển tiếp trang hoặc lùi trang, nó sẽ hiện ra 1 dãy nhị phân trên terminal của bạn, bạn copy dãy nhị phân đó ra và chuyển nó thành hex.
Mình đã viết 1 tool để chuyển nó, bạn có thể dùng:
https://hexdump-2-command-4-kindle.vercel.app/
Sau đó bạn cần chuyển đoạn hex thành lệnh để gửi qua ssh.
có thể dùng printf
printf "\x17\x2a\xbf\x67\x3f\x75\x06\x00\x01\x00\x6d\x00\x01\x00\x00\x00" > /dev/input/event2
printf "\x17\x2a\xbf\x67\x60\x75\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00" > /dev/input/event2
printf "\x17\x2a\xbf\x67\xd5\x55\x07\x00\x01\x00\x6d\x00\x00\x00\x00\x00" > /dev/input/event2
printf "\x17\x2a\xbf\x67\xd8\x55\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00" > /dev/input/event2
hoặc dùng dd
echo -ne "\x17\x2a\xbf\x67\x3f\x75\x06\x00\x01\x00\x6d\x00\x01\x00\x00\x00" | dd of=/dev/input/event2 bs=16
echo -ne "\x17\x2a\xbf\x67\x60\x75\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00" | dd of=/dev/input/event2 bs=16
echo -ne "\x17\x2a\xbf\x67\xd5\x55\x07\x00\x01\x00\x6d\x00\x00\x00\x00\x00" | dd of=/dev/input/event2 bs=16
echo -ne "\x17\x2a\xbf\x67\xd8\x55\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00" | dd of=/dev/input/event2 bs=16
làm tương tự với nút lùi trang mình cũng được
printf "\x3a\x2b\xbf\x67\xd6\x7e\x07\x00\x01\x00\x68\x00\x01\x00\x00\x00" > /dev/input/event2
printf "\x3a\x2b\xbf\x67\xd9\x7e\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00" > /dev/input/event2
printf "\x3a\x2b\xbf\x67\xeb\x66\x09\x00\x01\x00\x68\x00\x00\x00\x00\x00" > /dev/input/event2
printf "\x3a\x2b\xbf\x67\xed\x66\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00" > /dev/input/event2
echo -ne "\x3a\x2b\xbf\x67\xd6\x7e\x07\x00\x01\x00\x68\x00\x01\x00\x00\x00" | dd of=/dev/input/event2 bs=16
echo -ne "\x3a\x2b\xbf\x67\xd9\x7e\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00" | dd of=/dev/input/event2 bs=16
echo -ne "\x3a\x2b\xbf\x67\xeb\x66\x09\x00\x01\x00\x68\x00\x00\x00\x00\x00" | dd of=/dev/input/event2 bs=16
echo -ne "\x3a\x2b\xbf\x67\xed\x66\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00" | dd of=/dev/input/event2 bs=16
giờ chỉ cần gửi đoạn này qua ssh thì nó sẽ lật trang.
mình có tìm hiểu và được giải thích như sau
Cách hoạt động của input event trên Linux:
Trên Linux (và Kindle, vì nó cũng chạy Linux), tất cả các thiết bị đầu vào (bàn phím, chuột, màn hình cảm ứng, nút cứng...) đều được quản lý qua /dev/input/eventX, trong đó eventX là số tương ứng với từng thiết bị.
Các phím bấm sẽ tạo ra một sự kiện đầu vào (input event), chứa các thông tin như:
Loại sự kiện (event type): Phím bấm (EV_KEY). Mã phím (key code): Mã số tương ứng với từng phím, ví dụ 104 (PageUp), 109 (PageDown), 105 (Back). Trạng thái phím (key state): 1 → Phím được nhấn xuống (KEY_DOWN). 0 → Phím được thả (KEY_UP).
Tại sao ta cần hexdump?
Khi bạn chạy:
cat /dev/input/event2 | hexdump -C
và bấm một nút trên Kindle, bạn sẽ thấy dữ liệu nhị phân (binary) xuất hiện. Ví dụ:
00000000 3a 2b bf 67 d6 7e 07 00 01 00 68 00 01 00 00 00 |:+.g.~....h.....|
00000010 3a 2b bf 67 d9 7e 07 00 00 00 00 00 00 00 00 00 |:+.g.~..........|
00000020 3a 2b bf 67 eb 66 09 00 01 00 68 00 00 00 00 00 |:+.g.f....h.....|
00000030 3a 2b bf 67 ed 66 09 00 00 00 00 00 00 00 00 00 |:+.g.f..........|
Mỗi dòng 16 byte trên thực tế là một gói sự kiện (event packet), được gửi đến /dev/input/event2 khi bạn nhấn nút.
Giải thích cấu trúc dữ liệu Mỗi sự kiện đầu vào (input event) có cấu trúc như sau (chuẩn của Linux input_event):
| Byte Offset | Kích thước (byte) | Mô tả |
|------------|------------------|--------------------------------|
| 0-3 | 4 | Timestamp phần giây |
| 4-7 | 4 | Timestamp phần micro giây |
| 8-9 | 2 | Loại sự kiện (EV_KEY = 0x01) |
| 10-11 | 2 | Mã phím (KEY_...) |
| 12-15 | 4 | Trạng thái phím (1 = nhấn, 0 = thả) |
Ví dụ:
3a 2b bf 67 d6 7e 07 00 01 00 68 00 01 00 00 00
3a 2b bf 67 d6 7e 07 00: Timestamp.
01 00: Loại sự kiện (EV_KEY = 0x01).
68 00: Mã phím (0x68 = KEY_BACK).
01 00 00 00: Trạng thái (1 = phím được nhấn).
Và khi bạn thả nút:
3a 2b bf 67 d9 7e 07 00 00 00 00 00 00 00 00 00
00 00 00 00: Trạng thái (0 = phím được thả).
Mình cũng đã viết 1 ứng dụng trên mobile để thực hiện điều đó, xem video bên dưới, mình vẫn muốn viết thêm 1 số tính năng nữa nên tạm thời app sẽ chưa được public ra ngoài, chờ có time để hoàn thiện nốt.
