linux driver 简单实例

本文介绍了一个简单的Linux内核模块示例,包括helloworld.c源代码和Makefile配置。通过该示例展示了如何编译模块、加载及卸载模块,并在终端中查看到模块加载与卸载的输出信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

helloworld.c 代码:


#include <linux/module.h>

#include <linux/kernel.h>
#include <linux/init.h>

static int __init hellokernel_init(void)
{
    printk(KERN_INFO "hello kernel!\n");
    return 0;
}

static void __exit hellokernel_exit(void)
{
    printk(KERN_INFO "exit kernel!\n");
}

module_init(hellokernel_init);
module_exit(hellokernel_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("****");


Makefile 代码:

hailonxi@hailonxi-VirtualBox:~$ cat Makefile

obj-m := helloworld.o

PWD    := $(shell pwd)

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    rm -rf *.o *~core .*.cmd *.mod.c ./tmp_version


编译make:

hailonxi@hailonxi-VirtualBox:~$ make
make -C /lib/modules/3.11.0-15-generic/build M=/home/hailonxi modules
make[1]: Entering directory `/usr/src/linux-headers-3.11.0-15-generic'
  Building modules, stage 2.
  MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-headers-3.11.0-15-generic'

目录生成文件如下:

hailonxi@hailonxi-VirtualBox:~$ ls
Desktop           helloworld.c      helloworld.o    Music      Videos
Documents         helloworld.ko     Makefile        Pictures
Downloads         helloworld.mod.c  modules.order   Public
examples.desktop  helloworld.mod.o  Module.symvers  Templates


执行:

hailonxi@hailonxi-VirtualBox:~$
hailonxi@hailonxi-VirtualBox:~$ insmod helloworld.ko  //插入模块
insmod: error inserting 'helloworld.ko': -1 Operation not permitted===要root权限
hailonxi@hailonxi-VirtualBox:~$ sudo insmod helloworld.ko  ===插入模块
[sudo] password for hailonxi:
hailonxi@hailonxi-VirtualBox:~$ sudo rmmod helloworld ==删除模块
hailonxi@hailonxi-VirtualBox:~$ dmesg | tail -8  ===显示驱动的打印信息
[    8.684696] vesafb: framebuffer at 0xe0000000, mapped to 0xffffc90000680000, using 1216k, total 1216k
[    8.685904] Console: switching to colour frame buffer device 80x30
[    8.687450] fb0: VESA VGA frame buffer device
[   45.864889] audit_printk_skb: 171 callbacks suppressed
[   45.864892] type=1400 audit(1438051706.759:69): apparmor="DENIED" operation="open" parent=1 profile="/usr/lib/telepathy/mission-control-5" name="/usr/share/gvfs/remote-volume-monitors/" pid=1914 comm="mission-control" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
[  897.462531] type=1400 audit(1438052558.359:70): apparmor="DENIED" operation="capable" parent=1 profile="/usr/sbin/cupsd" pid=671 comm="cupsd" pid=671 comm="cupsd" capability=36  capname="block_suspend"
[ 1597.010173] hello kernel!
[ 1726.934708] exit kernel!

谢谢!!









### TCA9555PW 芯片的 Linux 驱动实现 对于 TCA9555PW 的 Linux 驱动支持,通常可以通过标准的 I2C 子系统来完成。Linux 内核已经提供了针对许多常见 GPIO 扩展器的支持模块,其中包括对 TCA9555 类型设备的部分通用处理逻辑。 #### 已有解决方案 在 Linux 中,`gpio-tca9554.c` 是一个常见的驱动文件,它主要用于 TI 公司生产的其他型号(如 TCA9554),但由于两者功能相似,可以作为参考基础开发 `tca9555` 的专用驱动[^1]。具体来说: - **I2C 设备注册**:TCA9555 使用 I2C 协议通信,在驱动加载时会通过 `i2c_new_device()` 或类似的函数将其挂载至系统的 I2C 总线上。 - **GPIO 控制接口**:内核中的 GPIO 子系统允许应用程序通过 `/sys/class/gpio/` 接口访问外部扩展器上的引脚状态。这需要定义一组特定于该芯片的操作方法,例如读取输入、设置输出方向以及触发中断等功能[^2]。 以下是基于现有框架的一个简单示例代码片段展示如何构建此类驱动程序的一部分: ```c #include <linux/i2c.h> #include <linux/module.h> #include <linux/gpio/driver.h> #define TCA9555_INPUT_PORT0 0x00 /* 输入寄存器 */ #define TCA9555_OUTPUT_PORT0 0x02 /* 输出寄存器 */ static int tca9555_read(struct i2c_client *client, u8 reg) { s32 ret; ret = i2c_smbus_read_byte_data(client, reg); if (ret < 0) { dev_err(&client->dev, "Failed to read from register %d\n", reg); return ret; } return ret & 0xFF; // 返回实际数据部分 } /* 设置某个管脚的方向为输入或者输出 */ static void tca9555_set_direction(struct gpio_chip *gc, unsigned offset, bool is_input) { struct i2c_client *client = gc->parent; // 实现细节省略... } ``` 上述代码仅展示了基本结构,并未完全覆盖所有必要组件。完整的驱动还需要考虑错误恢复机制、多实例管理等问题[^3]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值