标签: linux-device-driver

2
推荐指数
1
解决办法
420
查看次数

使用linux I2C驱动

我需要编写一个 Linux 设备驱动程序来连接到带有按钮和 LED 的外围显示板。

在驱动程序中,我需要通过 I2C 读取/写入外围板上的另一个 I2C 设备,然后从驱动程序内部将按钮按下事件发送到应用程序代码。

我想我已经设法使用输入子系统将键/按钮事件“模拟”到应用程序,我对这部分要求感到相当满意。

但是,我正在努力解决如何通过 I2C 总线与外围 I2C 设备交谈。我不想编写新的 I2C 通信例程,因为我希望可以使用已经存在的 I2C 通信 API。

我的问题是,有很多关于如何通过在内核中使用 i2c-dev 从应用程序(用户空间)使用 I2C 的文档,但我发现没有任何有用的内容来解释如何对特定的 I2C 进行调用I2C 总线,来自我自己的驱动程序(我的驱动程序调用 i2c 驱动程序??)。

我希望这是有道理的,我在互联网上看了很多东西,但似乎没有什么能简单地解释事情。

任何帮助apprciated,

谢谢

linux driver i2c linux-device-driver embedded-linux

2
推荐指数
1
解决办法
2076
查看次数

Linux 模块 __must_check 注释

我正在学习 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 …

c linux-device-driver linux-kernel

2
推荐指数
1
解决办法
2292
查看次数

如何识别多个USB声卡

我有一台带有 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)

alsa linux-device-driver

2
推荐指数
1
解决办法
1871
查看次数

在linux内核模块中访问GPIO的步骤是怎样的?

我正在努力找出从 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)

如何以正确的方式做到这一点?

linux linux-device-driver linux-kernel embedded-linux gpio

2
推荐指数
1
解决办法
4354
查看次数

USB 描述符的 ID_SERIAL 和 ID_SERIAL_SHORT udev 属性有什么区别

ID_SERIALID_SERIAL_SHORTudev 属性有什么区别。udev 如何为这 2 个 udev 属性 ID 分配值。我正在编写 USB 驱动程序,我正在使用udev_device_get_property_value()方法来获取 udev 属性的值。在这种情况下,我可以看到上面提到的 2 个类似的属性。我找不到这些信息的解释文件。

c usb udev linux-device-driver

2
推荐指数
1
解决办法
1550
查看次数

如何找到我的内核加载了哪个 RTC 模块?

在使用从 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)

我想知道是否可以摆脱这么多驱动程序,所以我开始四处寻找如何:

  1. 查看lsmod我没有看到 RTC 驱动程序
  2. lshw 也没有帮助
  3. 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

  • 这是否意味着我不需要所有其他驱动程序?
  • 这是否意味着我的笔记本电脑使用兼容 CMOS 的硬件?
  • 另外,为什么modinfo rtc_cmos什么都不返回?

linux linux-device-driver linux-kernel

2
推荐指数
1
解决办法
2569
查看次数

/lib/modules/&lt;version&gt;/build/ 不存在

我正在尝试编写一个非常基本的“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。

centos linux-device-driver

2
推荐指数
1
解决办法
4715
查看次数

如何读取设备树中保留内存的地址

我正在为小型设备在 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 *

linux-device-driver device-tree

2
推荐指数
1
解决办法
1349
查看次数

为什么在 linux 中需要连续内存分配?

大多数设备需要连续的内存。例如 GPU、VPU。

CMA 和静态内存分配是连续内存的例子。

为什么需要连续内存?

linux memory-management linux-device-driver linux-kernel embedded-linux

2
推荐指数
1
解决办法
2650
查看次数