android 读取节点是如何找到触摸屏设备节点

Android 框架之创建设备节点文件
与linux一样使用设备驱动来访问硬件设备,设备节点文件是设备驱动的逻辑文件,应用程序使用设备节点文件来访问设备驱动程序,linux使用mknod来创建设备节点文件,Android 有自己法子。
Android 使用Init 进程来创建设备节点文件,分两种情况:静态节点文件和动态节点文件,以应对已经定义好的冷插拔和运行起来后插入的热插拔设备。
对于冷插拔设备,init 进程事先获取等待冷插拔处理的驱动程序,事先定义好个驱动的设备节点文件(在android_source_code/system/core/init/devices.c中),在struct perms_devices[ ] 列出了设备节点的名称。访问权限,用户ID,组ID,若要添加新的用户定义的新设备需要在此结构体重添加相应信息。
init 首先调用device_init() 函数,创建一个socket 来接收uevent,再通过cold_boot() 调用do_coldboot()对内核启动时注册到/sys下的驱动程序进行冷插拔处理,do_coldboot会启动uevent,在handler_device_fd()中接收uevent信息,并写入到uevent struct 中,调用handle_device_event()创建节点文件,先创建所有的子目录,然后调用make_device()创建节点文件。
init 对于热插拔的动态设备,使用事件处理循环来完成,使用poll()监听来自驱动程序的uevent, 然后调用handle_device_fd()创建设备节点。Android如何生成设备节点
在Android中,由于没有mdev和udev,所以它没有办法动态的生成设备节点,那么它是如何做的呢?
我们可以在system/core/init/下的init.c和devices.c中找到答案:
int main(int argc, char **argv)
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);
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);
我们再来看看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);
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 && 8) |
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)
if (get_device_perm_inner(qemu_perms, path, uid, gid, &perm) == 0) {
} else if (get_device_perm_inner(devperms, path, uid, gid, &perm) == 0) {
struct listnode *
struct perm_node *perm_
struct perms_ *
list_for_each(node, &devperms_partners) {
perm_node = node_to_item(node, struct perm_node, plist);
dp = &perm_node-&
if (dp-&prefix) {
if (strncmp(path, dp-&name, strlen(dp-&name)))
if (strcmp(path, dp-&name))
*uid = dp-&
*gid = dp-&
return dp-&
return 0600;
我们最后可以看到在devperms中定义了要生成的设备节点:
static struct perms_ devperms[] = {
{ "/dev/null",
{ "/dev/zero",
{ "/dev/full",
{ "/dev/ptmx",
{ "/dev/tty",
{ "/dev/random",
{ "/dev/urandom",
{ "/dev/ashmem",
{ "/dev/binder",
{ "/dev/log/",
{ "/dev/msm_hw3dc",
{ "/dev/kgsl",
{ "/dev/diag",
AID_RADIO,
AID_RADIO,
{ "/dev/diag_arm9",
AID_RADIO,
AID_RADIO,
{ "/dev/android_adb",
{ "/dev/android_adb_enable",
{ "/dev/ttyMSM0",
AID_BLUETOOTH,
AID_BLUETOOTH,
{ "/dev/ttyHS0",
AID_BLUETOOTH,
AID_BLUETOOTH,
{ "/dev/uinput",
AID_SYSTEM,
AID_BLUETOOTH,
{ "/dev/alarm",
AID_SYSTEM,
AID_RADIO,
{ "/dev/tty0",
AID_SYSTEM,
{ "/dev/graphics/",
AID_GRAPHICS,
{ "/dev/msm_hw3dm",
AID_SYSTEM,
AID_GRAPHICS,
{ "/dev/input/",
AID_INPUT,
{ "/dev/eac",
AID_AUDIO,
{ "/dev/cam",
AID_CAMERA,
{ "/dev/pmem",
AID_SYSTEM,
AID_GRAPHICS,
{ "/dev/pmem_adsp",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/pmem_camera",
AID_SYSTEM,
AID_CAMERA,
{ "/dev/oncrpc/",
AID_SYSTEM,
{ "/dev/adsp/",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/snd/",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/mt9t013",
AID_SYSTEM,
AID_SYSTEM,
{ "/dev/msm_camera/",
AID_SYSTEM,
AID_SYSTEM,
{ "/dev/akm8976_daemon",0640,
AID_COMPASS,
AID_SYSTEM,
{ "/dev/akm8976_aot",
AID_COMPASS,
AID_SYSTEM,
{ "/dev/akm8973_daemon",0640,
AID_COMPASS,
AID_SYSTEM,
{ "/dev/akm8973_aot",
AID_COMPASS,
AID_SYSTEM,
{ "/dev/bma150",
AID_COMPASS,
AID_SYSTEM,
{ "/dev/cm3602",
AID_COMPASS,
AID_SYSTEM,
{ "/dev/akm8976_pffd",
AID_COMPASS,
AID_SYSTEM,
{ "/dev/lightsensor",
AID_SYSTEM,
AID_SYSTEM,
{ "/dev/msm_pcm_out",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_pcm_in",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_pcm_ctl",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_snd",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_mp3",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/audience_a1026", 0660,
AID_SYSTEM,
AID_AUDIO,
{ "/dev/tpa2018d1",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_audpre",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_audio_ctl", 0660,
AID_SYSTEM,
AID_AUDIO,
{ "/dev/htc-acoustic",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/vdec",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/q6venc",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/snd/dsp",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/snd/dsp1",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/snd/mixer",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/smd0",
AID_RADIO,
AID_RADIO,
{ "/dev/qemu_trace",
AID_SYSTEM,
AID_SYSTEM,
{ "/dev/qmi",
AID_RADIO,
AID_RADIO,
{ "/dev/qmi0",
AID_RADIO,
AID_RADIO,
{ "/dev/qmi1",
AID_RADIO,
AID_RADIO,
{ "/dev/qmi2",
AID_RADIO,
AID_RADIO,
{ "/dev/ts0710mux",
AID_RADIO,
AID_RADIO,
{ "/dev/ppp",
AID_RADIO,
{ "/dev/tun",
{ NULL, 0, 0, 0, 0 },
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!本博客仅用于暂存个人学习资料,不做他用,侵权请告知删除。
Android如何生成设备节点
原创作品,允许转载,转载时请务必以超链接形式标明文章
、作者信息和本声明。否则将追究法律责任。
在Android中,由于没有mdev和udev,所以它没有办法动态的生成设备节点,那么它是如何做的呢?
我们可以在system/core/init/下的init.c和devices.c中找到答案:
int main(int argc, char **argv) {
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);
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);
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 && 8) |
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) {
if (get_device_perm_inner(qemu_perms, path, uid, gid, &perm) == 0) {
} else if (get_device_perm_inner(devperms, path, uid, gid, &perm) == 0) {
struct listnode *
struct perm_node *perm_
struct perms_ *
list_for_each(node, &devperms_partners) {
perm_node = node_to_item(node, struct perm_node, plist);
dp = &perm_node-&
if (dp-&prefix) {
if (strncmp(path, dp-&name, strlen(dp-&name)))
if (strcmp(path, dp-&name))
*uid = dp-&
*gid = dp-&
return dp-&
return 0600;
我们最后可以看到在devperms中定义了要生成的设备节点:
static struct perms_ devperms[] = {
{ "/dev/null",
{ "/dev/zero",
{ "/dev/full",
{ "/dev/ptmx",
{ "/dev/tty",
{ "/dev/random",
{ "/dev/urandom",
{ "/dev/ashmem",
{ "/dev/binder",
{ "/dev/log/",
{ "/dev/msm_hw3dc",
{ "/dev/kgsl",
{ "/dev/diag",
AID_RADIO,
AID_RADIO,
{ "/dev/diag_arm9",
AID_RADIO,
AID_RADIO,
{ "/dev/android_adb",
{ "/dev/android_adb_enable",
{ "/dev/ttyMSM0",
AID_BLUETOOTH,
AID_BLUETOOTH,
{ "/dev/ttyHS0",
AID_BLUETOOTH,
AID_BLUETOOTH,
{ "/dev/uinput",
AID_SYSTEM,
AID_BLUETOOTH,
{ "/dev/alarm",
AID_SYSTEM,
AID_RADIO,
{ "/dev/tty0",
AID_SYSTEM,
{ "/dev/graphics/",
AID_GRAPHICS,
{ "/dev/msm_hw3dm",
AID_SYSTEM,
AID_GRAPHICS,
{ "/dev/input/",
AID_INPUT,
{ "/dev/eac",
AID_AUDIO,
{ "/dev/cam",
AID_CAMERA,
{ "/dev/pmem",
AID_SYSTEM,
AID_GRAPHICS,
{ "/dev/pmem_adsp",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/pmem_camera",
AID_SYSTEM,
AID_CAMERA,
{ "/dev/oncrpc/",
AID_SYSTEM,
{ "/dev/adsp/",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/snd/",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/mt9t013",
AID_SYSTEM,
AID_SYSTEM,
{ "/dev/msm_camera/",
AID_SYSTEM,
AID_SYSTEM,
{ "/dev/akm8976_daemon",0640,
AID_COMPASS,
AID_SYSTEM,
{ "/dev/akm8976_aot",
AID_COMPASS,
AID_SYSTEM,
{ "/dev/akm8973_daemon",0640,
AID_COMPASS,
AID_SYSTEM,
{ "/dev/akm8973_aot",
AID_COMPASS,
AID_SYSTEM,
{ "/dev/bma150",
AID_COMPASS,
AID_SYSTEM,
{ "/dev/cm3602",
AID_COMPASS,
AID_SYSTEM,
{ "/dev/akm8976_pffd",
AID_COMPASS,
AID_SYSTEM,
{ "/dev/lightsensor",
AID_SYSTEM,
AID_SYSTEM,
{ "/dev/msm_pcm_out",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_pcm_in",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_pcm_ctl",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_snd",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_mp3",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/audience_a1026", 0660,
AID_SYSTEM,
AID_AUDIO,
{ "/dev/tpa2018d1",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_audpre",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/msm_audio_ctl", 0660,
AID_SYSTEM,
AID_AUDIO,
{ "/dev/htc-acoustic",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/vdec",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/q6venc",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/snd/dsp",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/snd/dsp1",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/snd/mixer",
AID_SYSTEM,
AID_AUDIO,
{ "/dev/smd0",
AID_RADIO,
AID_RADIO,
{ "/dev/qemu_trace",
AID_SYSTEM,
AID_SYSTEM,
{ "/dev/qmi",
AID_RADIO,
AID_RADIO,
{ "/dev/qmi0",
AID_RADIO,
AID_RADIO,
{ "/dev/qmi1",
AID_RADIO,
AID_RADIO,
{ "/dev/qmi2",
AID_RADIO,
AID_RADIO,
{ "/dev/ts0710mux",
AID_RADIO,
AID_RADIO,
{ "/dev/ppp",
AID_RADIO,
{ "/dev/tun",
{ NULL, 0, 0, 0, 0 }, };
在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)对设备节点进行删除。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Android电阻触摸屏校准
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口android sensor怎样创建设备节点_百度知道
android sensor怎样创建设备节点
我有更好的答案
在Android中,由于没有mdev和udev,所以它没有办法动态的生成设备节点,那么它是如何做的呢?我们可以在system/core/init/下的init.c和devices.c中找到答案:init.c中我们看看get_device_perm如下实现:在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)对设备节点进行删除。
资深电脑人
Android 下应用程序不能直接 获得 root 权限,因此如果需要修改 /sys 或 /proc 等目录下的文件时,有以下两种方法可以选择:1.通过 service 或虚拟设备的方法将使得应用程序临时 获得 root 权限。可以使用360Root或者其他获取root权限的软件,针对不同的手机型号,可以下载对应的软件。2.在360root软件里面对 /sys 或 /proc 目录下的文件修改访问权限,使得它们能够被程序访问,设置为可读写。这也是考虑到安全问题,才不允许应用程序直接读取sys节点。
为您推荐:
其他类似问题
android的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 android 多节点进度条 的文章

 

随机推荐