Re: Device node at /dev/tty* not getting created for uart serial driver
On Mon, Nov 26, 2012 at 2:02 PM, Jinqiang Zeng <jinqiangzeng@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@gmail.com>
On Sat, Nov 24, 2012 at 2:20 PM, Manavendra Nath Manav <mnm.kernel@gmail.com> wrote:
Hi RK
On Sat, Nov 24, 2012 at 2:03 PM, Manavendra Nath Manav <mnm.kernel@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? -- Manavendra Nath Manav
On Wed, Nov 28, 2012 at 1:35 PM, Manavendra Nath Manav <mnm.kernel@gmail.com> wrote:
On Mon, Nov 26, 2012 at 2:02 PM, Jinqiang Zeng <jinqiangzeng@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@gmail.com>
On Sat, Nov 24, 2012 at 2:20 PM, Manavendra Nath Manav <mnm.kernel@gmail.com> wrote:
Hi RK
On Sat, Nov 24, 2012 at 2:03 PM, Manavendra Nath Manav <mnm.kernel@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
On Thu, Nov 29, 2012 at 4:12 PM, Mayur Nande <mayur.nan@gmail.com> wrote:
On Wed, Nov 28, 2012 at 1:35 PM, Manavendra Nath Manav <mnm.kernel@gmail.com> wrote:
On Mon, Nov 26, 2012 at 2:02 PM, Jinqiang Zeng <jinqiangzeng@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@gmail.com>
On Sat, Nov 24, 2012 at 2:20 PM, Manavendra Nath Manav <mnm.kernel@gmail.com> wrote:
Hi RK
On Sat, Nov 24, 2012 at 2:03 PM, Manavendra Nath Manav <mnm.kernel@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
participants (2)
-
Manavendra Nath Manav -
Mayur Nande