Firefly开源社区

打印 上一主题 下一主题

usb_register_dev 沒有在/dev底下新增裝置節點

19

积分

0

威望

0

贡献

游客

积分
19

usb_register_dev 沒有在/dev底下新增裝置節點

发表于 2015-1-12 09:58:38      浏览:8810 | 回复:3        打印      只看该作者   [复制链接] 楼主
Dear Firefly:
        I encountered a problem for USB drivers that usb_register_dev do not create device under /dev
Here is the code

static char *flv_devnode(struct device *dev, umode_t *mode)
{
        return kasprintf(GFP_KERNEL, "%s", dev_name(dev));
}

static struct usb_class_driver flv_class_driver = {
        .name =           "flv%d",
        .fops =             &flv_fops_nop,
        .devnode = flv_devnode,
        .minor_base = FLV_MINOR_BASE,
};

Static int flv_probe(struct usb_interface dev_if, …)
{

        usb_set_intfdata(dev_if, &flv_class_driver);

        retval = usb_register_dev(dev_if, &flv_class_driver);
        if (retval != 0) {
                /* something prevented us from registering this driver */
                printk(KERN_INFO "%s() unable to get a minor for this device.\n", __func__);
                usb_set_intfdata(dev_if, NULL);
                goto _safe_exit;
        }
}

The function usb_register_dev should create file not only under /sys/class/usbmisc/flv0, but under /dev/flv0.
However, I cannot see the device file under /dev.

I also refer to snd_register_device(), which successfully create device under /dev/snd, but can not find the key place.

Could you give me some suggestions?  Thank you very much.

Thanks,
回复

使用道具 举报

19

积分

0

威望

0

贡献

游客

积分
19
发表于 2015-1-13 14:48:00        只看该作者  沙发
Android init process will ignore usb uevent, so please modified  ~/$proj/system/core/init/device.c

...
if (!strncmp(uevent->subsystem, "usb", 3)) {
         if (!strcmp(uevent->subsystem, "usb")) {
            if (uevent->device_name) {
                /*
                 * create device node provided by kernel if present
                 * see drivers/base/core.c
                 */
                char *p = devpath;
                snprintf(devpath, sizeof(devpath), "/dev/%s", uevent->device_name);
                /* skip leading /dev/ */
                p += 5;
                /* build directories */
                while (*p) {
                    if (*p == '/') {
                        *p = 0;
                        make_dir(devpath, 0755);
                        *p = '/';
                    }
                    p++;
                }
             }
             else {
                 /* This imitates the file system that would be created
                  * if we were using devfs instead.
                  * Minors are broken up into groups of 128, starting at "001"
                  */
                 int bus_id = uevent->minor / 128 + 1;
                 int device_id = uevent->minor % 128 + 1;
                 /* build directories */
                 make_dir("/dev/bus", 0755);
                 make_dir("/dev/bus/usb", 0755);
                 snprintf(devpath, sizeof(devpath), "/dev/bus/usb/%03d", bus_id);
                 make_dir(devpath, 0755);
                 snprintf(devpath, sizeof(devpath), "/dev/bus/usb/%03d/%03d", bus_id, device_id);
             }
         } else {
             /* ignore other USB events */
                         if(!strncmp(name, "flv",3)){
                                 base = "/dev/";
                         }

                         else
                                return;
         }
...
回复

使用道具 举报

2918

积分

56

威望

46

贡献

高级创客

Rank: 6Rank: 6

积分
2918

优秀版主论坛元老

发表于 2015-1-13 19:08:50        只看该作者  板凳
{:3_48:}nice
回复

使用道具 举报

286

积分

0

威望

0

贡献

技术达人

Rank: 2

积分
286
发表于 2017-1-18 11:05:52        只看该作者  地板

thx.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表