yvo.engr
yvo.engr

Reputation: 141

How to attach to device context in another driver at Linux

Example: I use sensor TMP421 which driver is linux/drivers/hwmon/tmp421.c. It will export to /sys/class/hwmon/hwon0/.... And user can use cat command to read the temperatures. But my is request: I want to read it at kernel space to control some thing when the temperature reach to MAX values (example).

So how I can attach to get the device context to use the function

tmp421_data *tmp421_update_device(struct device *dev)

to read the temperature ?

Or is there another way ? I don't want to use the cat command at my code.

Thanks

Upvotes: 2

Views: 1442

Answers (2)

oakad
oakad

Reputation: 7585

Just do bus_find_device_by_name on an i2c_bus_type. It should give you the correct device pointer relatively easily. You will also have to change the tmp421_update_device function from "static" to "exported" (and move tmp421_data structure to an external header).

If you don't want to alter drivers not of your own, you can still try to emulate the approach sysfs takes when accessing device information. The sysfs dirent will be accessible to you at the dev->kobj.sd field and it's a fairly simple data structure.

Critically, you need to call put_device() on the received device handle after you've finished with it (otherwise you will end up with kernel lock-up down the line because of "unreleasable" objects). If you're using the kobj.sd accessor, then sysfs_get()/sysfs_put() on it will also be required.

Upvotes: 1

osgx
osgx

Reputation: 94175

As said in https://stackoverflow.com/a/4407051/196561 ("How to use sysfs inside kernel module?") by shodanex

it is a Bad Idea (tm)

with link http://www.linuxjournal.com/article/8110

Driving Me Nuts - Things You Never Should Do in the Kernel - From Issue #133 Linux Journal, 2005 By Greg Kroah-Hartman

The article says that it is possible to use sys_open and sys_read from modules to open and read files:

old_fs = get_fs();
set_fs(KERNEL_DS);

fd = sys_open(filename, O_RDONLY, 0);
if (fd >= 0) {
  /* read the file here */
  sys_close(fd);
}
set_fs(old_fs);

Don't know will it work with files in /sys or not.

And Greg warns us:

I Never Told You about This. In conclusion, reading and writing a file from within the kernel is a bad, bad thing to do. Never do it. Ever.

Better way may be to learn inter module communications, possibly with modifying the hwmon/tmp421.c.

Upvotes: 0

Related Questions