《Linux裝置節點建立》手動與自動建立裝置節點

2021-06-18 19:10:32 字數 3845 閱讀 7009

android2.3及linux2.6.29核心模擬器版本編譯與除錯

一、手動建立

1.驅動模組

test_driver.c

//#include #include #include #include #include #include #include #include #define test_major 240

//動態裝置節點

//struct class *mymodule_class;

//結束

static int test_led_open(struct inode *inode, struct file *file)

static int test_led_close(struct inode *inode, struct file *file)

static int test_led_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

static int test_led_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)

static struct file_operations led_fops = ;

static int __init test_drv_init(void)

//devfs檔案系統建立

/* devfs_mk_cdev( mkdev(test_major, 0),

s_ifchr | s_irusr | s_iwusr | s_irgrp, "test_dev");

*///結束

//實現動態建立

//mymodule_class = class_create(this_module, "test_dev");//在/sys/class/下建立「test_dev」目錄

//device_create(mymodule_class, null, mkdev(test_major, 0), null, "tankai_dev"); //在/dev/下建立「tankai_dev」檔案

//結束

printk ("ok!\n");

return 0;

out_chrdev:

unregister_chrdev(test_major, "mymodule");

}

static void __exit test_drv_exit(void)

module_init(test_drv_init);

module_exit(test_drv_exit);

module_author("tank");

module_license("gpl");

makefile

obj-m := test_driver.o

pwd := $(shell pwd)

#kerneldir := /usr/src/linux-headers-3.0.0-26-generic/

kerneldir := /home/android2.3/android2.3_kernel/

default:

$(make) -c $(kerneldir) m=$(pwd) modules

# cp -rf mini.ko ../module/

# cp -rf lddbus.ko ../module/

clean:

rm *.mod.c *.o *.ko *.bak modules.* module.*

2.android模擬器沒有mknod命令,我們實現它

mknod.c

#include #include #define s_ifchr 0020000

int main(int argc,char *argv)

char *devname = argv[1];

printf("devname is %s\n",devname);

int devnum = -1;

sscanf(argv[2],"%d",&devnum);

printf("devnum is %d\n",devnum);

if(mknod(devname,s_ifchr|0666,makedev(devnum,0))!=0)

perror("mknod");

return 0;

}

android.mk
local_path:= $(call my-dir)

include $(clear_vars)

local_src_files:= \

mknod.c

local_shared_libraries := \

libutils

local_module:= mknod

local_module_tags := optional

include $(build_executable)

檢視:cat /proc/devices

結果:

character devices:

1 mem

4 /dev/vc/0

4 tty

5 /dev/tty

5 /dev/console

5 /dev/ptmx

7 vcs

10 misc

13 input

14 sound

29 fb

90 mtd

116 alsa

128 ptm

136 pts

240 test_dev

253 ttys

254 rtc

block devices:

1 ramdisk

259 blkext

7 loop

31 mtdblock

43 nbd

179 mmc

執行:./mknod /dev/tankai_dev 240

//這裡只需要給出主裝置號,主裝置號相同的裝置使用同一驅動程式;只是加入次裝置號後可以實現乙個驅動,多個裝置使用的情況。這個目前我們的驅動中沒有實現;因此,次裝置號可以隨便。

ll /dev/tankai_dev

結果:

crw-rw-rw- root     root     240,   0 2013-10-16 09:54 tankai_dev
3.測試用例

testdriver.c

#include #include #include #include #include #include #include int main()
android.mk

local_path:= $(call my-dir)

include $(clear_vars)

local_src_files:= \

testdriver.c

local_shared_libraries := \

libutils

local_module:= testdriver

local_module_tags := optional

include $(build_executable)

二、自動建立

放通驅動中「建立」和「結束」部分**;就不需要在執行mknod命令,裝置節點會被建立,見:《linux裝置節點建立》核心kobject上報uevent過濾規則 及 《linux裝置節點建立》使用者空間ueventd建立裝置節點規則。

Linux驅動學習(3 裝置節點 手動建立)

模組 chr test.c to test the chr dev for ap operation by wozon include include include include include module license gpl dev t dev struct cdev cdev int ...

linux自動建立裝置節點

在有2.6系列版本中支援udev管理裝置檔案可以方便的建立裝置節點,不必使用mknod來建立 主要用到的四個方法在linux device.h定義 建立類和釋放類的函式 建立成後將建立 sys class name資料夾 extern struct class class create struct...

android如何手動生成裝置節點

init.rc裡所有可用的command都定義在system core init keyword.h裡,預設是不包含mknod的。事實上,android的init程序會通過kenel的uevent來自動建立裝置節點 見system core init devices.c裡的make device 函...