Skip to contentSkip to conversation

Char device initialization

DISCUSSION Daniel Hilst Selli 3 participants 4 messages Nov 9, 2011

lore
Share & tools
lore
#0 lore raw

I'm trying to create a example char device. The example compiles fine, but when I try to "cat" I got "No such device or address". I have reviewed the code thousend times and can't see what I'm missing

Here is the code -> http://pastebin.com/Td03U0fK

The read method is not good, I know, but is never called.

I use my own running kenrel to test, I know that is danger. I'm building a qemu enviroment to test this better.

Here is uname -a:
Linux archlinux 3.0-ARCH #1 SMP PREEMPT Fri Oct 7 11:35:34 CEST 2011 x86_64 Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHz GenuineIntel GNU/Linux

Any idea?

Thanks

#1 lore raw
Quoted 11 lines · Daniel Hilst Selli

I'm trying to create a example char device. The example compiles fine, but when I try to "cat" I got "No such device or address". I have reviewed the code thousend times and can't see what I'm missing

Here is the code -> http://pastebin.com/Td03U0fK

The read method is not good, I know, but is never called.

I use my own running kenrel to test, I know that is danger. I'm building a qemu enviroment to test this better.

Quoted 7 lines

Here is uname -a:
Linux archlinux 3.0-ARCH #1 SMP PREEMPT Fri Oct 7 11:35:34 CEST 2011 x86_64 Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHz GenuineIntel GNU/Linux

Any idea?

Thanks

You tried to 'cat' a /dev/my_device file, right? Was that device file created with the mknod command?

Signature · 4 lines
Alexandru Juncu

ROSEdu
http://rosedu.org
#2 lore raw
Quoted 27 lines · Alexandru Juncu
Quoted 11 lines · Daniel Hilst Selli

I'm trying to create a example char device. The example compiles fine, but when I try to "cat" I got "No such device or address". I have reviewed the code thousend times and can't see what I'm missing

Here is the code -> http://pastebin.com/Td03U0fK

The read method is not good, I know, but is never called.

I use my own running kenrel to test, I know that is danger. I'm building a qemu enviroment to test this better.

Quoted 7 lines

Here is uname -a:
Linux archlinux 3.0-ARCH #1 SMP PREEMPT Fri Oct 7 11:35:34 CEST 2011 x86_64 Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHz GenuineIntel GNU/Linux

Any idea?

Thanks

You tried to 'cat' a /dev/my_device file, right? Was that device file created with the mknod command?

--
Alexandru Juncu

Quoted 8 lines

ROSEdu
http://rosedu.org

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies at kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Hello Daniel,

I had the look at the code. The issue is with the cdev_add() call in init_gcdev() function.

int cdev_add(struct cdev *p, dev_t dev, unsigned count) is the prototype

Now the problem was *instead of passing second argument of type dev_t you were passing minor number macro.

*Fix : - Do following additions : -

1. static int major; // Declare a global major no var.

2. In init_gcdev() after call to alloc_chrdev_region() get major no and store in major var.

major = MAJOR(gcdev->dev);

3. Replace cdev_add() call like this : -

cdev_add(&gcdev->cdev, MKDEV(major, FIRST_MINOR), 1);

Now its running and your read methos is getting called.

Hello Alexandru,

That error was due to improper args passed to cdev_add(). If device file is not present (no mknod done) error would be "No such file or dir"

Regards,
Rohan Puri
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20111109/e85cb3dd/attachment.html

#3 lore raw
Quoted 70 lines · rohan puri

On Wed, Nov 9, 2011 at 7:22 PM, Alexandru Juncu <[email protected] <mailto:[email protected]>> wrote:

On Wed, Nov 9, 2011 at 3:41 PM, Daniel Hilst Selli <danielhilst at gmail.com <mailto:[email protected]>> wrote:
> I'm trying to create a example char device. The example compiles
fine,
> but when I try to "cat" I got "No such device or address". I have > reviewed the code thousend times and can't see what I'm missing >
> Here is the code -> http://pastebin.com/Td03U0fK
>
> The read method is not good, I know, but is never called. >
> I use my own running kenrel to test, I know that is danger. I'm
building
> a qemu enviroment to test this better.
>
> Here is uname -a:
> Linux archlinux 3.0-ARCH #1 SMP PREEMPT Fri Oct 7 11:35:34 CEST 2011 > x86_64 Intel(R) Core(TM) i3 CPU M 370 @ 2.40GHz GenuineIntel
GNU/Linux
>
> Any idea?
>
> Thanks

You tried to 'cat' a /dev/my_device file, right? Was that device file created with the mknod command?

--
Alexandru Juncu

ROSEdu
http://rosedu.org

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies at kernelnewbies.org <mailto:[email protected]>
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Hello Daniel,

I had the look at the code. The issue is with the cdev_add() call in init_gcdev() function.

int cdev_add(struct cdev *p, dev_t dev, unsigned count) is the prototype

Now the problem was *instead of passing second argument of type dev_t you were passing minor number macro.

*Fix : - Do following additions : -

1. static int major; // Declare a global major no var.

2. In init_gcdev() after call to alloc_chrdev_region() get major no and store in major var.

major = MAJOR(gcdev->dev);

3. Replace cdev_add() call like this : -

  cdev_add(&gcdev->cdev, MKDEV(major, FIRST_MINOR), 1);

Now its running and your read methos is getting called.

Quoted 7 lines

Hello Alexandru,

That error was due to improper args passed to cdev_add(). If device file is not present (no mknod done) error would be "No such file or dir"

Regards,
Rohan Puri

Thanks Rohan, my fault!