Device node at /dev/tty* not getting created for uart serial driver

Mayur Nande mayur.nan at gmail.com
Thu Nov 29 06:01:05 EST 2012


On Thu, Nov 29, 2012 at 4:12 PM, Mayur Nande <mayur.nan at gmail.com> wrote:
> On Wed, Nov 28, 2012 at 1:35 PM, Manavendra Nath Manav
> <mnm.kernel at gmail.com> wrote:
>> On Mon, Nov 26, 2012 at 2:02 PM, Jinqiang Zeng <jinqiangzeng at gmail.com> wrote:
>>>
>>> first creat a device class,then register a device to the kernel. using the following functions:
>>> struct class *class_create(struct module *owner, char *name);
>>>  struct class_device *class_device_create(struct class *cls,
>>>                       struct class_device *parent,
>>>                       dev_t devt,
>>>                       struct device *device, char *fmt, ...)
>>>
>>>
>>> 2012/11/26 Manavendra Nath Manav <mnm.kernel at gmail.com>
>>>>
>>>>
>>>> On Sat, Nov 24, 2012 at 2:20 PM, Manavendra Nath Manav <mnm.kernel at gmail.com> wrote:
>>>>>
>>>>> Hi RK
>>>>>
>>>>> On Sat, Nov 24, 2012 at 2:03 PM, Manavendra Nath Manav <mnm.kernel at gmail.com> wrote:
>>>>>>
>>>>>> I have written a simple UART serial driver in embedded Linux running busybox with mdev rules. I have provided .dev_name as "ttyC2C" in my driver code.
>>>>>>
>>>>>> static struct uart_driver serial_omap_reg = {
>>>>>>    .owner      = THIS_MODULE,
>>>>>>    .driver_name   = "Omap-C2C-Serial",
>>>>>>    .dev_name   = "ttyC2C",
>>>>>>    .nr      = OMAP_MAX_HSUART_PORTS,
>>>>>>    .cons    = NULL,
>>>>>> };
>>>>>>
>>>>>> However the node is getting created in
>>>>>>
>>>>>> ./sys/devices/platform/omap_c2c_uart.0/tty/ttyC2C0
>>>>>> ./sys/class/tty/ttyC2C0
>>>>>>
>>>>>> / # ls -l ./sys/class/tty/ttyC2C0
>>>>>> lrwxrwxrwx    1 root     0                0 Jan  1 00:14 ./sys/class/tty/ttyC2C0 -> ../../devices/platform/omap_c2c_uart.0/tty/ttyC2C0
>>>>>>
>>>>>> / # ls -l ./sys/devices/platform/omap_c2c_uart.0/tty/ttyC2C0
>>>>>> -r--r--r--    1 root     0             4096 Jan  1 00:14 dev
>>>>>> lrwxrwxrwx    1 root     0                0 Jan  1 00:14 device -> ../../../omap_c2c_uart.0
>>>>>> drwxr-xr-x    2 root     0                0 Jan  1 00:14 power
>>>>>> lrwxrwxrwx    1 root     0                0 Jan  1 00:14 subsystem -> ../../../../../class/tty
>>>>>> -rw-r--r--    1 root     0             4096 Jan  1 00:14 uevent
>>>>>> / #
>>>>>>
>>>>>> The mdev rules for tty are:
>>>>>>
>>>>>> tty 0:5 0666
>>>>>> tty.* 0:0 0620
>>>>>>
>>>>>> How to get device node as /dev/ttyC2C ?
>>>>>>
>>>>>> --
>>>>>> Manavendra Nath Manav
>>>>>
>>>>>
>>>>> can you help me on following issue?
>>>>>
>>>>> --
>>>>> Manavendra Nath Manav
>>>>
>>>>
>>>> In "Essential Linux Device Drivers" book, it says that that the driver name in "struct platform_driver" and "struct uart_driver" should be same. I modified the code according but still /dev/ttyC2C node is not being populated.
>>>>
>>>> --
>>>> Manavendra Nath Manav
>>
>>
>> When i add .major and .minor to the struct uart_driver and create the
>> device node manually using "mknod" then the driver works fine. Why the
>> kernel (3.4.0) is not able to create it automatically?
>
> In the driver, you just need to take care of populating the
> appropriate device class and device information into the /sys. udev
> should then take care of the rest (assuming you are using udev).
> Something like this should work:
>
> struct class *cl = class_create(THIS_MODULE, "<device_class_name>");
>
> device_create(cl, NULL, first, NULL, "<device_name>", ...);
>
> first is dev_t with the corresponding <major, minor>. /dev should than
> have the /dev/device_name entry.
>
> This should work. If it does not, please share your code if possible.
> HTH!
>
> Regards
> Mayur

Also, clone the latest tree from kernel.org and see commit
c3b19ff06e0808555403491d61e8f0cbbb53e933. struct class_device was
removed. So you have to use device_create now in place of
class_device_create. I think ELDD may be use the later.

Regards
Mayur



More information about the Kernelnewbies mailing list