做网站要主机还是服务器,申请做网站要什么局,重庆市卫生厅网站 查询前置审批,什么是电子商务行业从这里开始外设驱动介绍#xff0c;这里使用的IMX8的芯片作为驱动介绍
开发流程#xff1a;
修改设备树#xff0c;配置 GPIO1_IO07 为 GPIO 输出。使用 sysfs 接口或编写驱动程序控制 GPIO 引脚。编译并测试。
这里假设设备树#xff0c;已经配置好了。不在论述这个问题…从这里开始外设驱动介绍这里使用的IMX8的芯片作为驱动介绍
开发流程
修改设备树配置 GPIO1_IO07 为 GPIO 输出。使用 sysfs 接口或编写驱动程序控制 GPIO 引脚。编译并测试。
这里假设设备树已经配置好了。不在论述这个问题设备树的问题。会其它地方单独来说这里说明如何编写驱动程序。
应用1 IO口输出
1.1 硬件介绍
LED 是英文 Light Emitting Diode 的缩写译为发光二极管。是由含镓Ga、砷As、磷P、氮N等的化合物制成。发光二极管是半导体二极管中的一种可以把电能转换成光能与普通二极管一样具有单向导电性。LED 灯应用例如开关指示灯、LED 广告牌、LED 显示屏、LED 车灯、红路灯等。
平台有 4 个 LED 灯每个 LED 接一个 IO 引脚通过控制 IO 的高低来控制灯的亮灭。 对应四个IO口 GPIO1_IO07 D7 GPIO1_IO08 D8 GPIO5_IO03 D9 GPIO1_IO01 D10
2 引脚编号介绍
2.1 GPIO口分布
这个是IMX8 的芯片的引脚分布可以看到引脚编号从GPIO1~GPIO5,每组GPIO的有20到32 个引脚具体要看芯片的介绍。
2.2 IMX8 内核 获取引脚号
查看引脚的编号
cat /sys/kernel/debug/gpio 这里看出四个引脚的对应的编号 计算公式global_gpio_number (GPIO控制器号 - 1) * 32 引脚号
GPIO1_IO07 D7 对应GPIO0 编号 077 GPIO1_IO08 D8 对应GPIO0 编号 088 GPIO5_IO03 D9 对应GPIO4 编号 1287135 GPIO1_IO01 D10 对应GPIO0 编号 011
3 驱动程序编写
3.1 sysfs 控制 GPIO口
导出该引脚
echo 7 /sys/class/gpio/export设置方向为输出
echo out /sys/class/gpio/gpio7/direction设置输出电平
echo 1 /sys/class/gpio/gpio7/valueecho 0 /sys/class/gpio/gpio7/value清理
echo 7 /sys/class/gpio/unexport3.2 使用 GPIO 子系统 API 编写内核驱动
对应linux的驱动代码
int gpio_request(unsigned gpio, const char *label);
void gpio_free(unsigned gpio);
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);
int gpio_get_value(unsigned gpio);
void gpio_set_value(unsigned gpio, int value);3.2.1 驱动代码
需要开发包含头文件
#include linux/gpio.h
#include linux/of_gpio.h
#include linux/platform_device.h
#include linux/module.h#include linux/gpio.h
#include linux/module.h
#include linux/kernel.h#define MY_GPIO_PIN 7 // 使用 GPIO 编号 24static int __init my_gpio_init(void)
{int ret;// 请求 GPIOret gpio_request(MY_GPIO_PIN, my_gpio);if (ret) {pr_err(Failed to request GPIO %d, error %d\n, MY_GPIO_PIN, ret);return ret;}// 设置 GPIO 为输出并设置初始值为高gpio_direction_output(MY_GPIO_PIN, 1);pr_info(GPIO %d set as output with initial value 1\n, MY_GPIO_PIN);// 设置 GPIO 为低电平gpio_set_value(MY_GPIO_PIN, 0);pr_info(GPIO %d set to 0\n, MY_GPIO_PIN);return 0;
}static void __exit my_gpio_exit(void)
{// 释放 GPIOgpio_free(MY_GPIO_PIN);pr_info(GPIO %d freed\n, MY_GPIO_PIN);
}module_init(my_gpio_init);
module_exit(my_gpio_exit);MODULE_LICENSE(GPL);
MODULE_AUTHOR(Your Name);
MODULE_DESCRIPTION(Simple GPIO Driver Example);3.2.2 编译编译文件
obj-m : my_gpio_driver.oKDIR : /lib/modules/$(shell uname -r)/buildall:make -C $(KDIR) M$(PWD) modulesclean:make -C $(KDIR) M$(PWD) clean3.2.3 加载驱动模块
加载驱动到内核库中
sudo insmod my_gpio_driver.ko检查日记验证是否成功
dmesg3.2.4 卸载驱动模块
sudo rmmod my_gpio_driver3.2.5 总结
总结
编写驱动代码使用 gpio_request() 请求 GPIO并通过方向设置和读写操作控制 GPIO。编译驱动模块使用 make 和 Makefile 将驱动编译成 .ko 内核模块。 加载模块通过 insmod 加载驱动使用 dmesg 检查加载日志。测试 GPIO 驱动通过硬件验证 GPIO 的输入或输出功能。 卸载驱动通过 rmmod 卸载模块并释放 GPIO。用户空间操作 GPIO通过 sysfs 接口在用户空间控制 GPIO。
4 应用代码编写
实现流水灯效果
int main(int argc ,char* argv[])
{int fd;fd open(/dev/ledtest, O_RDWR, 0777);//打开模块设备文件if(fd 0){ //打开失败printf(open device error\n);return -1;}while(1){ioctl(fd, 1, 0);//调用ioctl命令,第一参数是灯开第二个参数是第几个灯sleep(1);ioctl(fd, 1, 1);sleep(1);ioctl(fd, 1, 2);sleep(1);ioctl(fd, 1, 3);sleep(1);ioctl(fd, 0, 0);//调用ioctl命令,第一参数是灯关第二个参数是第几个灯sleep(1);ioctl(fd, 0, 1);sleep(1);ioctl(fd, 0, 2);sleep(1);ioctl(fd, 0, 3);sleep(1); }
}