当前位置: 首页 > news >正文

练习uart和摄像头内核驱动开发测试

利用Linux内核驱动开发,目前仅完成串口测试和摄像头测试

1、串口:以内核自带的串口驱动为基础,编写测试程序

uart.h

#ifndef __UART_H__
#define __UART_H__#include <termios.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>// 打开串口设备并配置为115200波特率、8位数据位、无校验、1位停止位
int open_serial_port(const char *port);// 写入数据到串口
int write_to_serial(int fd, const char *data, size_t length);// 从串口读取数据
int read_from_serial(int fd, char *buffer, size_t buffer_size);// 关闭串口设备
void close_serial_port(int fd);#endif // TERMIOS_H

uart.c

#include "uart.h"
int open_serial_port(const char *port) {// 打开串口设备(阻塞模式)int fd = open(port, O_RDWR | O_NOCTTY);if (fd == -1) {perror("Error opening serial port");return -1;}// 获取当前串口配置struct termios options;if (tcgetattr(fd, &options) != 0) {perror("tcgetattr failed");close(fd);return -1;}// 设置波特率为115200cfsetispeed(&options, B115200);cfsetospeed(&options, B115200);// 配置数据位、停止位和校验位options.c_cflag &= ~CSIZE;  // 清除数据位掩码options.c_cflag |= CS8;     // 8位数据位options.c_cflag &= ~PARENB; // 无校验位options.c_cflag &= ~CSTOPB; // 1位停止位// 启用接收和本地模式options.c_cflag |= (CLOCAL | CREAD);// 设置原始输入模式(非规范模式)options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);// 禁用特殊输出处理options.c_oflag &= ~OPOST;// 设置超时:立即返回(VMIN=0, VTIME=0)//options.c_cc[VMIN] = 0;//options.c_cc[VTIME] = 0;// 修改 c_cc 配置,启用阻塞读options.c_cc[VMIN] = 1;   // 至少读取1个字符才返回options.c_cc[VTIME] = 10; // 等待超时:1秒(10 * 0.1秒)// 应用配置if (tcsetattr(fd, TCSANOW, &options) != 0) {perror("tcsetattr failed");close(fd);return -1;}// 清空缓冲区tcflush(fd, TCIOFLUSH);return fd;
}int write_to_serial(int fd, const char *data, size_t length) {ssize_t bytes_written = write(fd, data, length);if (bytes_written < 0) {perror("Error writing to serial port");}return bytes_written;
}int read_from_serial(int fd, char *buffer, size_t buffer_size) {ssize_t bytes_read = read(fd, buffer, buffer_size - 1);if (bytes_read < 0) {perror("Error reading from serial port");return -1;}buffer[bytes_read] = '\0'; // 添加字符串结束符return bytes_read;
}void close_serial_port(int fd) {if (fd >= 0) {close(fd);}
}

main.c

#include "uart.h"int main(void)
{int uartfd = 0;int nret = 0;char tmpbuff[4096] = {0};uartfd = open_serial_port("/dev/ttymxc2");if (-1 == uartfd){printf("open_serial_port failed\n");return -1;}while (1){   write_to_serial(uartfd, "hello world", 11);memset(tmpbuff, 0, sizeof(tmpbuff));nret = read_from_serial(uartfd, tmpbuff, sizeof(tmpbuff));printf("nret = %d, tmpbuff = %s\n", nret, tmpbuff);sleep(1);}close_serial_port(uartfd);return 0;
}

2、摄像头ov5640测试

一、修改设备树
1、    在i2c2下添加ov5640信息

2、    设置pinctrl子系统中的摄像头复位引脚

3、    开启CSI接口配置

二、修改内核加入ov5640相关驱动模块:
1、通过图形界面修改

2. 重新编译内核、设备树、驱动模块

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage
make dtbs
make modules


3. 将设备树和内核镜像拷贝到tftp管理目录下

cp arch/arm/boot/dts/imx6ull-alientek-emmc.dtb ~/tftpboot
cp arch/arm/boot/zImage ~/tftpboot


4. 将所有的内核驱动模块安装到文件系统下

make INSTALL_MOD_PATH=/home/linux/nfs/rootfs modules_install


5. 重新启动开发板,并插上ov5640摄像头
6. 在开发板端加载摄像头内核驱动模块

cd /lib/modules/4.1.15 depmod -a
modprobe mx6s_capture.ko modprobe ov5640_camera.ko


7. 查看是否生成摄像头设备节点

ls /dev/video1。


三、编写测试文件测试摄像头功能

http://www.dtcms.com/a/323474.html

相关文章:

  • imx6ull-驱动开发篇15——linux自旋锁
  • 2025-08-09 李沐深度学习14——经典卷积神经网络 (2)
  • 【C++】模版进阶
  • redis存储原理与数据模型
  • 复数与频谱的联系
  • 库函数蜂鸣器的使用(STC8)
  • ECML PKDD 2025 | 时间序列(Time Series)论文总结
  • “秦时明月”提前布局商标被电视剧侵权!
  • 深入理解 RedisTemplate:简化 Java 与 Redis 的交互!
  • 【系统编程】进程创建
  • 本地进行语音文字互转
  • 国内外大模型体验与评测
  • Vue2 字段值映射通用方法
  • Python 属性描述符(描述符用法建议)
  • 基于Prometheus、Grafana、Loki与Tempo的统一监控平台故障排查与解决方案
  • redis开启局域网访问
  • C++讲解---通过转换函数和运算符函数直接调用类的对象
  • Horse3D引擎研发笔记(三):使用QtOpenGL的Shader编程绘制彩色三角形
  • Aurora设计注意问题
  • 【递归、搜索和回溯】FloodFill 算法介绍及相关例题
  • 11. 为什么要用static关键字
  • 香橙派 RK3588 部署千问大模型 Qwen2-VL-2B 多轮交互式对话
  • 【工具】Python多环境管理
  • ubuntu安装ollama流程
  • Day 8: 深度学习综合实战与进阶技术 - 从优化到部署的完整流程
  • Java+Vue打造的采购招投标一体化管理系统,涵盖招标、投标、开标、评标全流程,功能完备,附完整可二次开发的源码
  • 数据结构day06
  • 102-基于Spark的招聘数据预测分析推荐系统
  • 物质和暗物质形成机制
  • 【排序算法】④堆排序