为什么与printf不同,Linux 内核模块中的printk缺乏浮点支持
我需要编写一个 Linux 设备驱动程序来连接到带有按钮和 LED 的外围显示板。
在驱动程序中,我需要通过 I2C 读取/写入外围板上的另一个 I2C 设备,然后从驱动程序内部将按钮按下事件发送到应用程序代码。
我想我已经设法使用输入子系统将键/按钮事件“模拟”到应用程序,我对这部分要求感到相当满意。
但是,我正在努力解决如何通过 I2C 总线与外围 I2C 设备交谈。我不想编写新的 I2C 通信例程,因为我希望可以使用已经存在的 I2C 通信 API。
我的问题是,有很多关于如何通过在内核中使用 i2c-dev 从应用程序(用户空间)使用 I2C 的文档,但我发现没有任何有用的内容来解释如何对特定的 I2C 进行调用I2C 总线,来自我自己的驱动程序(我的驱动程序调用 i2c 驱动程序??)。
我希望这是有道理的,我在互联网上看了很多东西,但似乎没有什么能简单地解释事情。
任何帮助apprciated,
谢谢
我正在学习 Linux 内核模块开发。我阅读了文章和教程,并找到了一个提供简单字符设备源代码的站点。
在代码中,a__must_check用于一个函数。
这是原型:
__must_check int register_device(void);
Run Code Online (Sandbox Code Playgroud)
这是函数:
int register_device(void)
{
int result = 0;
printk( KERN_NOTICE "Simple-driver: register_device() is called." );
result = register_chrdev( 0, device_name, &simple_driver_fops );
if( result < 0 )
{
printk( KERN_WARNING "Simple-driver: can\'t register character device with errorcode = %i", result );
return result;
}
device_file_major_number = result;
printk( KERN_NOTICE "Simple-driver: registered character device with major number = %i and minor numbers 0...255"
, device_file_major_number );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有什么用__must_check …
我有一台带有 USB 集线器和多个 USB 声卡的 Linux 计算机。
这是我使用 aplay -l 命令可以看到的内容:
aplay -l
**** Liste des Périphériques Matériels PLAYBACK ****
carte 0: ALSA [bcm2835 ALSA], périphérique 0: bcm2835 ALSA [bcm2835 ALSA]
Sous-périphériques: 8/8
Sous-périphérique #0: subdevice #0
Sous-périphérique #1: subdevice #1
Sous-périphérique #2: subdevice #2
Sous-périphérique #3: subdevice #3
Sous-périphérique #4: subdevice #4
Sous-périphérique #5: subdevice #5
Sous-périphérique #6: subdevice #6
Sous-périphérique #7: subdevice #7
carte 0: ALSA [bcm2835 ALSA], périphérique 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
Sous-périphériques: 1/1
Sous-périphérique #0: …Run Code Online (Sandbox Code Playgroud) 我正在努力找出从 linux 内核模块访问 gpio-pin 需要哪些步骤。也许有人可以通过一个简单的例子向我解释它。我喜欢使用引脚 4(输入)和 33(输出)。到目前为止我的步骤:
1.) 设备树(dts):我保持 dts 文件不变 - 我是否需要通过引脚控制设置引脚 4 和 33?
2.) 内核模块:一些伪代码
gpio_is_valid(4)
gpio_request_one(4, GPIOF_DIR_IN | GPIOF_EXPORT_DIR_FIXED , "myPin4")
gpio_export(4, false)
gpio_get_value(4)
gpio_is_valid(33)
gpio_request_one(33, GPIOF_DIR_OUT | GPIOF_INIT_LOW | GPIOF_OPEN_SOURCE | GPIOF_EXPORT_DIR_FIXED , "myPin33")
gpio_export(33, false)
gpio_set_value(33, 1)
Run Code Online (Sandbox Code Playgroud)
如何以正确的方式做到这一点?
ID_SERIAL和ID_SERIAL_SHORTudev 属性有什么区别。udev 如何为这 2 个 udev 属性 ID 分配值。我正在编写 USB 驱动程序,我正在使用udev_device_get_property_value()方法来获取 udev 属性的值。在这种情况下,我可以看到上面提到的 2 个类似的属性。我找不到这些信息的解释文件。
在使用从 Ubuntu OS 16.04 获得的配置文件编译我的内核期间,我注意到我正在编译很多 RTC 驱动程序,基本上所有可能的驱动程序:
... snip ...
CC [M] drivers/rtc/rtc-bq4802.o
CC [M] drivers/rtc/rtc-da9052.o
CC [M] drivers/rtc/rtc-da9055.o
... more of those ...
...
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以摆脱这么多驱动程序,所以我开始四处寻找如何:
lsmod我没有看到 RTC 驱动程序lshw 也没有帮助lspci -v 也没有产生太多信息。较低级别的检查,显示设备存在:
$ ls -l /dev/rtc
lrwxrwxrwx 1 root root 4 Dec 18 09:54 /dev/rtc -> rtc0
Run Code Online (Sandbox Code Playgroud)
我得到的最接近的信息是/sys/class/rtc/:
$ sudo cat /sys/class/rtc/rtc0/device/rtc/rtc0/name
rtc_cmos
Run Code Online (Sandbox Code Playgroud)
这是否意味着我的内核使用的唯一驱动程序是rtc_cmos?
modinfo rtc_cmos什么都不返回?我正在尝试编写一个非常基本的“Hello World”设备驱动程序示例,该示例在任何设备驱动程序实现介绍性课程中都有讲授。我的makefile如下:
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/bulid
PWD := $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)
当我使用 make 命令时,它显示 /lib/modules/version_no/build/ 不存在。所以我进入目录/lib/modules/version_no,发现有一个目录build,但是如果我使用ls命令,它打印成红色,这意味着该目录已被弃用。它包含一个指向 ../../../usr/src/version_no 的链接,但令我惊讶的是,该链接中的版本号与 /usr/src/ 中实际文件夹的名称不同。谁能指出是什么问题?我正在使用 centos 6.1。
我正在为小型设备在 Linux 中编写设备驱动程序。设备有一些特殊的内存限制,迫使我开辟一块内存,在我的驱动程序中,我需要知道保留内存的地址(和大小)
/ {
reserved-memory {
my_reserve: my_reserve@a0000000 {
compatible = "shared-dma-pool";
reg = <0 0xa0000000 0 0x20000>;
no-map;
};
};
my_device {
compatible = "my_device";
memory-region = <&my_reserve>;
};
};
Run Code Online (Sandbox Code Playgroud)
如何0xa000'0000在我的设备驱动程序中读取保留内存的物理地址(即如何读取值)?似乎有一个用于保留内存的 API,但是我看不到任何返回struct reserved_mem *
大多数设备需要连续的内存。例如 GPU、VPU。
CMA 和静态内存分配是连续内存的例子。
为什么需要连续内存?
linux memory-management linux-device-driver linux-kernel embedded-linux