導航:首頁 > 器材知識 > 如何自動創建設備節點

如何自動創建設備節點

發布時間:2024-04-11 02:37:06

Ⅰ LINUX設備節點

是這樣的,之所以復有的制時候不需要你自己創建節點,因為有程序自動創建。
class_create和device_create,具體用法很簡單,你自己查查就知道了。

還有,mknod都是在剛開始學習的時候用到,難道你以後寫驅動都要手動建立設備節點嗎?

Ⅱ 如何在udev自動創建設備節點

創建設備文件的方法:
第一種是使用mknod手工創建:mknod filename type major minor
第二種是自動創建設備節點:利用udev(mdev)來實現設備文件的自動創建,首先應保證支持udev(嵌入式系統用mdev),由busybox配置。
udev介紹
udev 運行在用戶模式,而非內核中。udev 的初始化腳本在系統啟動時創建設備節點,並且當插入新設備——加入驅動模塊——在sysfs上注冊新的數據後,udev會創新新的設備節點。
udev 是一個工作在用戶空間的工具,它能根據系統中硬體設備的狀態動態的更新設備文件,包括設備文件的創建,刪除,許可權等。這些文件通常都定義在/dev 目錄下,但也可以在配置文件中指定。udev 必須內核中的sysfs和tmpfs支持,sysfs 為udev 提供設備入口和uevent 通道,tmpfs 為udev 設備文件提供存放空間。
注意,udev 是通過對內核產生的設備文件修改,或增加別名的方式來達到自定義設備文件的目的。但是,udev 是用戶模式程序,其不會更改內核行為。也就是說,內核仍然會創建sda,sdb等設備文件,而udev可根據設備的唯一信息來區分不同的設備,並產生新的設備文件(或鏈接)。而在用戶的應用中,只要使用新產生的設備文件

Ⅲ Android怎麼生成設備節點

Android如何生成設備節點
在Android中,由於沒有mdev和udev,所以它沒有辦法動態的生成設備節點,那麼它是如何做的呢?
我們可以在system/core/init/下的init.c和devices.c中找到答案:
init.c中
int main(int argc, char **argv)
{
...
/* Get the basic filesystem setup we need put
* together in the initramdisk on / and then we'll
* let the rc file figure out the rest.
*/
mkdir("/dev", 0755);
mkdir("/proc", 0755);
mkdir("/sys", 0755);

mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
mkdir("/dev/pts", 0755);
mkdir("/dev/socket", 0755);
mount("devpts", "/dev/pts", "devpts", 0, NULL);
mount("proc", "/proc", "proc", 0, NULL);
mount("sysfs", "/sys", "sysfs", 0, NULL);

for(;;) {
...
if (ufds[0].revents == POLLIN)
handle_device_fd(device_fd);

if (ufds[1].revents == POLLIN)
handle_property_set_fd(property_set_fd);
if (ufds[3].revents == POLLIN)
handle_keychord(keychord_fd);
}

return 0;
}

我們再來看看handle_device_fd(),該函數定義在devices.c中
void handle_device_fd(int fd)
{
...
handle_device_event(&uevent);
handle_firmware_event(&uevent);
}
}

而handle_device_event定義如下:
static void handle_device_event(struct uevent *uevent)
{
...
if(!strcmp(uevent->action, "add")) {
make_device(devpath, block, uevent->major, uevent->minor);
return;
}
...
}

make_device定義如下:
static void make_device(const char *path, int block, int major, int minor)
{
...
mode = get_device_perm(path, &uid, &gid) | (block S_IFBLK : S_IFCHR);
dev = (major $amp; ...
setegid(gid);
mknod(path, mode, dev);
chown(path, uid, -1);
setegid(AID_ROOT);
}

我們看看get_device_perm如下實現:
static mode_t get_device_perm(const char *path, unsigned *uid, unsigned *gid)
{
mode_t perm;

if (get_device_perm_inner(qemu_perms, path, uid, gid, &perm) == 0) {
return perm;
} else if (get_device_perm_inner(devperms, path, uid, gid, &perm) == 0) {
return perm;
} else {
struct listnode *node;
struct perm_node *perm_node;
struct perms_ *dp;

/* Check partners list. */
list_for_each(node, &devperms_partners) {
perm_node = node_to_item(node, struct perm_node, plist);
dp = &perm_node->dp;

if (dp->prefix) {
if (strncmp(path, dp->name, strlen(dp->name)))
continue;
} else {
if (strcmp(path, dp->name))
continue;
}
/* Found perm in partner list. */
*uid = dp->uid;
*gid = dp->gid;
return dp->perm;
}
/* Default if nothing found. */
*uid = 0;
*gid = 0;
return 0600;
}
}

我們最後可以看到在devperms中定義了要生成的設備節點:
static struct perms_ devperms[] = {
{ "/dev/null", 0666, AID_ROOT, AID_ROOT, 0 },
{ "/dev/zero", 0666, AID_ROOT, AID_ROOT, 0 },
{ "/dev/full", 0666, AID_ROOT, AID_ROOT, 0 },
{ "/dev/ptmx", 0666, AID_ROOT, AID_ROOT, 0 },
{ "/dev/tty", 0666, AID_ROOT, AID_ROOT, 0 },
{ "/dev/random", 0666, AID_ROOT, AID_ROOT, 0 },
{ "/dev/urandom", 0666, AID_ROOT, AID_ROOT, 0 },
{ "/dev/ashmem", 0666, AID_ROOT, AID_ROOT, 0 },
{ "/dev/binder", 0666, AID_ROOT, AID_ROOT, 0 },

/* logger should be world writable (for logging) but not readable */
{ "/dev/log/", 0662, AID_ROOT, AID_LOG, 1 },

/* the msm hw3d client device node is world writable/readable. */
{ "/dev/msm_hw3dc", 0666, AID_ROOT, AID_ROOT, 0 },

/* gpu driver for adreno200 is globally accessible */
{ "/dev/kgsl", 0666, AID_ROOT, AID_ROOT, 0 },

/* these should not be world writable */
{ "/dev/diag", 0660, AID_RADIO, AID_RADIO, 0 },
{ "/dev/diag_arm9", 0660, AID_RADIO, AID_RADIO, 0 },
{ "/dev/android_adb", 0660, AID_ADB, AID_ADB, 0 },
{ "/dev/android_adb_enable", 0660, AID_ADB, AID_ADB, 0 },
{ "/dev/ttyMSM0", 0600, AID_BLUETOOTH, AID_BLUETOOTH, 0 },
{ "/dev/ttyHS0", 0600, AID_BLUETOOTH, AID_BLUETOOTH, 0 },
{ "/dev/uinput", 0660, AID_SYSTEM, AID_BLUETOOTH, 0 },
{ "/dev/alarm", 0664, AID_SYSTEM, AID_RADIO, 0 },
{ "/dev/tty0", 0660, AID_ROOT, AID_SYSTEM, 0 },
{ "/dev/graphics/", 0660, AID_ROOT, AID_GRAPHICS, 1 },
{ "/dev/msm_hw3dm", 0660, AID_SYSTEM, AID_GRAPHICS, 0 },
{ "/dev/input/", 0660, AID_ROOT, AID_INPUT, 1 },
{ "/dev/eac", 0660, AID_ROOT, AID_AUDIO, 0 },
{ "/dev/cam", 0660, AID_ROOT, AID_CAMERA, 0 },
{ "/dev/pmem", 0660, AID_SYSTEM, AID_GRAPHICS, 0 },
{ "/dev/pmem_adsp", 0660, AID_SYSTEM, AID_AUDIO, 1 },
{ "/dev/pmem_camera", 0660, AID_SYSTEM, AID_CAMERA, 1 },
{ "/dev/oncrpc/", 0660, AID_ROOT, AID_SYSTEM, 1 },
{ "/dev/adsp/", 0660, AID_SYSTEM, AID_AUDIO, 1 },
{ "/dev/snd/", 0660, AID_SYSTEM, AID_AUDIO, 1 },
{ "/dev/mt9t013", 0660, AID_SYSTEM, AID_SYSTEM, 0 },
{ "/dev/msm_camera/", 0660, AID_SYSTEM, AID_SYSTEM, 1 },
{ "/dev/akm8976_daemon",0640, AID_COMPASS, AID_SYSTEM, 0 },
{ "/dev/akm8976_aot", 0640, AID_COMPASS, AID_SYSTEM, 0 },
{ "/dev/akm8973_daemon",0640, AID_COMPASS, AID_SYSTEM, 0 },
{ "/dev/akm8973_aot", 0640, AID_COMPASS, AID_SYSTEM, 0 },
{ "/dev/bma150", 0640, AID_COMPASS, AID_SYSTEM, 0 },
{ "/dev/cm3602", 0640, AID_COMPASS, AID_SYSTEM, 0 },
{ "/dev/akm8976_pffd", 0640, AID_COMPASS, AID_SYSTEM, 0 },
{ "/dev/lightsensor", 0640, AID_SYSTEM, AID_SYSTEM, 0 },
{ "/dev/msm_pcm_out", 0660, AID_SYSTEM, AID_AUDIO, 1 },
{ "/dev/msm_pcm_in", 0660, AID_SYSTEM, AID_AUDIO, 1 },
{ "/dev/msm_pcm_ctl", 0660, AID_SYSTEM, AID_AUDIO, 1 },
{ "/dev/msm_snd", 0660, AID_SYSTEM, AID_AUDIO, 1 },
{ "/dev/msm_mp3", 0660, AID_SYSTEM, AID_AUDIO, 1 },
{ "/dev/audience_a1026", 0660, AID_SYSTEM, AID_AUDIO, 1 },
{ "/dev/tpa2018d1", 0660, AID_SYSTEM, AID_AUDIO, 1 },
{ "/dev/msm_audpre", 0660, AID_SYSTEM, AID_AUDIO, 0 },
{ "/dev/msm_audio_ctl", 0660, AID_SYSTEM, AID_AUDIO, 0 },
{ "/dev/htc-acoustic", 0660, AID_SYSTEM, AID_AUDIO, 0 },
{ "/dev/vdec", 0660, AID_SYSTEM, AID_AUDIO, 0 },
{ "/dev/q6venc", 0660, AID_SYSTEM, AID_AUDIO, 0 },
{ "/dev/snd/dsp", 0660, AID_SYSTEM, AID_AUDIO, 0 },
{ "/dev/snd/dsp1", 0660, AID_SYSTEM, AID_AUDIO, 0 },
{ "/dev/snd/mixer", 0660, AID_SYSTEM, AID_AUDIO, 0 },
{ "/dev/smd0", 0640, AID_RADIO, AID_RADIO, 0 },
{ "/dev/qemu_trace", 0666, AID_SYSTEM, AID_SYSTEM, 0 },
{ "/dev/qmi", 0640, AID_RADIO, AID_RADIO, 0 },
{ "/dev/qmi0", 0640, AID_RADIO, AID_RADIO, 0 },
{ "/dev/qmi1", 0640, AID_RADIO, AID_RADIO, 0 },
{ "/dev/qmi2", 0640, AID_RADIO, AID_RADIO, 0 },
/* CDMA radio interface MUX */
{ "/dev/ts0710mux", 0640, AID_RADIO, AID_RADIO, 1 },
{ "/dev/ppp", 0660, AID_RADIO, AID_VPN, 0 },
{ "/dev/tun", 0640, AID_VPN, AID_VPN, 0 },
{ NULL, 0, 0, 0, 0 },
};

Ⅳ android sensor怎樣創建設備節點

在Android中,由於沒有mdev和udev,所以它沒有辦法動態的生成設備節點,那麼它是如何做的呢?

我們可以在system/core/init/下的init.c和devices.c中找到答案:

init.c中

在Android中,沒有獨立的類似於udev或者mdev的用戶程序,這個功能集成到了init中做了。代碼見:system/core/init/init.c文件,如下:

if (ufds[0].revents == POLLIN)

handle_device_fd(device_fd);

其中handle_device_fd(device_fd)函數在system/core/init/devices.c中實現,參數device_fd 由函數device_init()->open_uevent_socket()->socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT)函數調用返回。

函數handle_device_fd(device_fd)中,根據傳進來的device_fd參數,調用recv(fd, msg, UEVENT_MSG_LEN, 0)函數,將內核探測到的設備並通過NETLINK機制傳過來的socket描述符轉化成消息。接著調用parse_event(msg, &uevent);函數將消息翻譯成uevent事件,並將改事件傳遞給handle_device_event(&uevent)函數。

handle_device_event(&uevent)函數中,依據參數uevent->subsystem類型創建dev下的相應目錄,如:/dev/graphics。緊接著根據uevent->action是"add"還是"remove"來實現設備節點的創建與刪除。如果uevent->action是"add",則調用make_device(devpath, block, uevent->major, uevent->minor)函數生成設備節點。如果uevent->action是"remove",則調用unlink(devpath)對設備節點進行刪除。

Ⅳ linux鍔犺澆dts鐨勬椂鍊欎細鍒涘緩璁懼囪妭鐐瑰悧

From:http://m.blog.csdn.net/blog/liliyaya/9188193

1. 鍦\kernel\of\fdt.c 涓鏈夊備笅鍒濆嬪寲鍑芥暟 娉ㄩ噴涓婏細灞曞紑璁懼囨爲錛屽壋寤篸evice_nodes鍒板叏灞鍙橀噺allnodes涓

void __init unflatten_device_tree(void)
{
__unflatten_device_tree(initial_boot_params, &allnodes,
early_init_dt_alloc_memory_arch);

/* Get pointer to "/chosen" and "/aliasas" nodes for use everywhere */
of_alias_scan(early_init_dt_alloc_memory_arch);
}
unflatten_device_tree鍑芥暟琚玸etup_arch鍑芥暟璋冪敤錛
鍥犱負鎴戜滑浣跨敤寰楁槸arm騫沖彴鎵浠ュ瓨鍦\kernel\arch\arm\kernel\setup.c涓
void __init setup_arch(char **cmdline_p)
{
unflatten_device_tree()
}

setup_arch鍑芥暟鍦╧ernel鍚鍔ㄦ槸琚璋冪敤錛屽備笅鍚鍔╧ernel瀛樺湪\kernel\init\main.c涓
asmlinkage void __init start_kernel(void)
{
setup_arch(&command_line);
}

榪欎簺宸ヤ綔瀹屾垚瑙f瀽DTS鏂囦歡銆備繚瀛樺埌鍏ㄥ矓閾捐〃allnodes涓銆

2銆佸湪makefile涓鏈夎繖孌佃瘽鏉ョ紪璇慸ts鏂囦歡錛

$(obj)/A20%.dtb: $(src)/dts/A20%.dts FORCE
$(call if_changed_dep,dtc)

$(obj)/A68M%.dtb: $(src)/dts/A68M%.dts FORCE
$(call if_changed_dep,dtc)

鍜.c鏂囦歡鐢熸垚.o鏂囦歡涓鏍 鍥炵敓鎴.dtb鏂囦歡銆傚湪
/home/liyang/workspace/SZ_JB-mr1-8628-bsp-1012/out/target/proct/msm8226/obj/KERNEL_OBJ/arch/arm/boot
鐩褰曚笅錛屼笌zimage涓涓鐩褰曘

3銆
鍦 board-8226.c涓鏈夊垵濮嬪寲鍑芥暟-->鍚鍔ㄨ嚜鍔ㄦ帀鐢
void __init msm8226_init(void)
{
of_platform_populate(NULL, of_default_bus_match_table, adata, NULL);
}

of_platform_populate鍦╧ernel\driver\of\platform.c涓瀹氫箟錛屽洖鏌ヨ

root = root ? of_node_get(root) : of_find_node_by_path("/");
for_each_child_of_node(root, child)
{
rc = of_platform_bus_create(child, matches, lookup, parent, true);
if (rc)
break;
}
of_node_put(root);

鍦ㄨ繖閲岀敤鍒板緱鍑芥暟of_find_node_by_path浼氭渶緇堣皟鐢ㄥ埌kernel\driver\of\base.c涓寰楀嚱鏁
struct device_node *of_find_node_by_path(const char *path)
{
閬嶅巻絎1姝ヤ腑寰梐llnodes鎵懼埌鏍硅妭鐐
}

of_platform_bus_create()鍑芥暟涓鍒涘緩寰楀唴瀹瑰瓨鍦ㄤ簡 adata涓銆

浠ヤ笅鍐呭逛負杞杞斤細

錛2錛変嬌鐢―TS娉ㄥ唽鎬葷嚎璁懼囩殑榪囩▼

浠ラ珮閫8974騫沖彴涓轟緥錛屽湪娉ㄥ唽i2c鎬葷嚎鏃訛紝浼氳皟鐢ㄥ埌qup_i2c_probe()鎺ュ彛錛岃ユ帴鍙g敤浜庣敵璇鋒葷嚎璧勬簮鍜屾坊鍔爄2c閫傞厤鍣ㄣ傚湪鎴愬姛娣誨姞i2c閫傞厤鍣ㄥ悗錛屼細璋冪敤of_i2c_register_devices()鎺ュ彛銆傛ゆ帴鍙d細瑙f瀽i2c鎬葷嚎鑺傜偣鐨勫瓙鑺傜偣錛堟寕杞藉湪璇ユ葷嚎涓婄殑i2c璁懼囪妭鐐癸級錛岃幏鍙杋2c璁懼囩殑鍦板潃銆佷腑鏂鍙風瓑紜浠朵俊鎮銆傜劧鍚庤皟鐢╮equest_mole()鍔犺澆璁懼囧瑰簲鐨勯┍鍔ㄦ枃浠訛紝璋冪敤i2c_new_device()錛岀敓鎴恑2c璁懼囥傛ゆ椂璁懼囧拰椹卞姩閮藉凡鍔犺澆錛屼簬鏄痙rvier閲岄潰鐨刾robe鏂規硶灝嗚璋冪敤銆傚悗闈㈡祦紼嬪氨鍜屼箣鍓嶄竴鏍蜂簡銆
綆鑰岃█涔嬶紝Linux閲囩敤DTS鎻忚堪璁懼囩‖浠朵俊鎮鍚庯紝鐪佸幓浜嗗ぇ閲忔澘鏂囦歡鍨冨溇淇℃伅銆侺inux鍦ㄥ紑鏈哄惎鍔ㄩ樁孌碉紝浼氳В鏋怐TS鏂囦歡錛屼繚瀛樺埌鍏ㄥ矓閾捐〃allnodes涓錛屽湪鎺夌敤.init_machine鏃訛紝浼氳窡鎹產llnodes涓鐨勪俊鎮娉ㄥ唽騫沖彴鎬葷嚎鍜岃懼囥傚煎緱娉ㄦ剰鐨勬槸錛屽姞杞芥祦紼嬪苟涓嶆槸鎸夋壘浠庢爲鏍瑰埌鏍戝彾鐨勬柟寮忛掑綊娉ㄥ唽錛岃屾槸鍙娉ㄥ唽鏍硅妭鐐逛笅鐨勭涓綰у瓙鑺傜偣錛岀浜岀駭鍙婁箣鍚庣殑瀛愯妭鐐規殏涓嶆敞鍐屻侺inux緋葷粺涓嬬殑璁懼囧ぇ澶氶兘鏄鎸傝澆鍦ㄥ鉤鍙版葷嚎涓嬬殑錛屽洜姝ゅ湪騫沖彴鎬葷嚎琚娉ㄥ唽鍚庯紝浼氭牴鎹產llnodes鑺傜偣鐨勬爲緇撴瀯錛屽幓瀵繪壘璇ユ葷嚎鐨勫瓙鑺傜偣錛屾墍鏈夌殑瀛愯妭鐐瑰皢琚浣滀負璁懼囨敞鍐屽埌璇ユ葷嚎涓娿

閱讀全文

與如何自動創建設備節點相關的資料

熱點內容
賣保健儀器需要哪些手續 瀏覽:258
dn50pvc管用什麼閥門 瀏覽:617
閥門廠型砂造型 瀏覽:870
小冰箱裝製冷劑要多少錢 瀏覽:225
gads工具箱優缺點 瀏覽:430
近視散光儀器是怎麼檢測的 瀏覽:346
翻砂鑄造法是什麼意思 瀏覽:237
前輪軸承有什麼區別 瀏覽:54
地暖小閥門有什麼用 瀏覽:438
混合馬達運用哪些設備 瀏覽:450
小汽車輪胎軸承怎麼檢查 瀏覽:358
水炮安裝前有什麼閥門管件 瀏覽:354
超聲波檢查報告丟了怎麼辦 瀏覽:369
機械顏色代表什麼 瀏覽:207
分水反應實驗裝置圖 瀏覽:534
製冷劑怎麼轉移到另一個瓶子 瀏覽:288
製冰機怎麼製冷 瀏覽:205
電動車儀表上能量管理是干什麼 瀏覽:529
hsms是什麼儀器 瀏覽:357
浙江凱隆電動工具 瀏覽:674