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

Mayur Nande mayur.nan at gmail.com
Thu Nov 29 05:42:33 EST 2012


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



More information about the Kernelnewbies mailing list