2017年7月31日 星期一

2017年7月20日 星期四

[工作] command line寫入16進位binary到檔案

$ echo -e "\x10\x11\x12" > test
$ cat test | xxd
$ 0000000: 1011 120a

後面的0x0a為換行符號

$ printf '\xde\xad\xbe\xef' > file
$ cat file | xxd
$ 0000000: dead beef

[工作] 在sysfs下加入GPIO debug

在那根GPIO還沒有被request的狀態下:
echo [GPIO number] > /sys/class/gpio/export
就會產生/sys/class/gpio/gpio[GPIO number]
ex.
echo 4 > /sys/class/gpio/export
cd /sys/class/gpio/gpio4
裡面會有幾個節點可以操作
active_low
device
edge
power
uevent
value

如果那根GPIO已經被driver request,
則上面的方式會無效,
需要從code裡面來作:
呼叫gpiolib裡提供的方式
gpiod_export(GPIO_NUM);

就會產生類似上面的節點.

2017年7月5日 星期三

[工作] 在Android上如何能在USB拔除後繼續抓log

一般來說子程序在父程序結束後也會被kill掉,
Android上有個nohup指令能防止子程序被kill,
並把父程序轉給init(pid = 1)

使用範例:
adb shell "nohup cat /proc/kmsg > /sdcard/test"

之後就算你USB拔除, 他還是會繼續抓log

2017年7月3日 星期一

[工作] Kernel driver讀寫文件的方式

Header檔:
#include <linux/fs.h>
#include <linux/file.h>
#include <asm/uaccess.h>

程式碼:
char *path = "/abc/test"
struct file *fp = NULL;
mm_segment_t old_fs;
u8 buf[256];

fp = filp_open(path, O_RDONLY, 0);
if (fp == NULL) {
    return -1;
}

old_fs = get_fs();
set_fs(KERNEL_DS);

fp->f_op->read(fp, buf, sizeof(buf), &fp->f_pos);

set_fs(old_fs);

filp_close(fp, NULL);


主要重點是紅字的部份

簡單來說是要防止User space破壞到Kernel space的內容

傳遞給->read / ->write的參數因為是kernel的位址

會被認為不合法, user被禁止存取,

所以要先把ds改成kernel, 才不會被誤認成user

大概是個root的概念

不過操作完記得設回來