网站域名空间一年费用是多少钱,中山精品网站建设公司,怎么去推广自己的店铺,四川建设厅官方网站查询目录
一. 开发板桥接
二. 开发板白屏
三. 0324-MPU6050开发
3.1 函数详解
3.2 常用 ioctl 请求码#xff08;request#xff09;
3.3 头文件详解
四. 获取鼠标信息
4.1 获取鼠标信息
4.2 内核修改并编译
五. QT基础使用
六. 内核打印Hello world
七. 内核GPIO
…目录
一. 开发板桥接
二. 开发板白屏
三. 0324-MPU6050开发
3.1 函数详解
3.2 常用 ioctl 请求码request
3.3 头文件详解
四. 获取鼠标信息
4.1 获取鼠标信息
4.2 内核修改并编译
五. QT基础使用
六. 内核打印Hello world
七. 内核GPIO
八. 内核i2c通信mpu信息获取
8.1 input_button
8.2 kmpu 一. 开发板桥接 1.连接开发板sudo minicom -D /dev/ttyUSB0 密码emb 用户root passwordroot 2.开发板桥接虚拟机 用usb桥接虚拟机有线链接PCI关闭以太网设置手动主机192.168.1.99子网掩码设置 桥接完成后ping ip地址互相 3.通过联网拷贝文件到开发板 虚拟机编译arm-linux-gnueabihf-gcc -o hello.out hello.c 拷贝到开发板scp hello.out root192.168.1.10:/home/root 二. 开发板白屏 1开发板白屏示例
#include stdio.h
#include fcntl.h
#include unistd.h
#include linux/fb.h
#include sys/ioctl.h
#include sys/mman.h
#include stdlib.h
#include string.hstruct fb_fix_screeninfo finfo;
struct fb_var_screeninfo vinfo;int main() {int fd open(/dev/fb0,O_RDWR,0);ioctl(fd,FBIOGET_FSCREENINFO,finfo);ioctl(fd,FBIOGET_VSCREENINFO,vinfo);int screensize vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;printf(screensize:%d Byte\r\n,screensize);printf(x:%d, y:%d, %d, vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);int* fb_buffer(int*)mmap(NULL,screensize,PROT_READ | PROT_WRITE, MAP_SHARED, fd,0);memset(fb_buffer, 0xff, screensize);munmap(fb_buffer, screensize);close(fd);return 0;
}
2开发板按键示例
#include stdio.h
#include fcntl.h
#include unistd.h
#include linux/fb.h
#include sys/ioctl.h
#include sys/mman.h
#include stdlib.h
#include string.hstruct fb_fix_screeninfo finfo;
struct fb_var_screeninfo vinfo;int main() {int fd open(/dev/mem,O_RDWR|O_SYNC);if(fd 0){perror(Cant Open /dev/mem!\r\n);return -1;}void* ammap(NULL, 0x1000,PROT_READ | PROT_WRITE, MAP_SHARED, fd,0xf8000000);if((int)a -1){perror(mmap fail!\r\n);close(fd);return -1;}int tmp *(unsigned int*)(a 0x12c);*((unsigned int*)(a 0x12c)) tmp | 0x00400000;munmap(a, 0x1000);a mmap(NULL, 0x1000,PROT_READ | PROT_WRITE, MAP_SHARED, fd,0xe000a000);if((int)a -1){perror(mmap fail!\r\n);close(fd);return -1;}tmp *(unsigned int*)(a 0x048);printf(GPIO0:%d\r\n, tmp);munmap(a, 0x1000);close(fd);return 0;
}
点灯960\906
cd /sys/class/gpio/
echo 960 export
cd gpio960
ls
echo out direction
# 灭灯
echo 1 value
三. 0324-MPU6050开发
#includestdio.h
#includefcntl.h
#includesys/ioctl.h
#includeunistd.h
#includelinux/i2c-dev.hint main()
{int fd;if((fd open(/dev/i2c-0, O_RDWR)) 0){perror(open i2c-0 fail!\n);return -1;}unsigned char buf[] {0};unsigned char wrbuf[] {0x75};ioctl(fd, I2C_SLAVE, 0x68);write(fd, wrbuf, 1);read(fd, buf, 1);printf(%x\r\n, buf[0]);return 0;
}返回值0x68 获取mpu6050返回值
#includestdio.h
#include linux/i2c.h
#include linux/i2c-dev.h
#include sys/ioctl.h
#include fcntl.h
#include unistd.h int main()
{int fd;if((fd open(/dev/i2c-0, O_RDWR)) 0){perror(open i2c-0 fail!\n);return -1;}unsigned char buf[] {0};unsigned char wrbuf[] {0x6B,0x00};ioctl(fd, I2C_SLAVE, 0x68);struct i2c_rdwr_ioctl_data transmit;struct i2c_msg msgs[2];write(fd, wrbuf, 2);char wbuf[1] {0x3B};char rbuf[10] {0};msgs[0].len 1;msgs[0].buf wbuf;msgs[0].addr 0x68;msgs[0].flags I2C_M_STOP;msgs[1].len 6;msgs[1].buf rbuf;msgs[1].addr 0x68;msgs[1].flags I2C_M_RD | I2C_M_STOP; transmit.msgsmsgs;transmit.nmsgs 2;ioctl(fd, I2C_RDWR, transmit);printf(%x %x\r\n, rbuf[0], rbuf[1]);return 0;
}3.1 函数详解
功能Unix/Linux 系统中用于 设备 I/O 控制Input/Output Control的头文件允许用户程序与设备驱动进行交互执行设备特定的操作如配置、状态查询等 函数原型#include sys/ioctl.h int ioctl(int fd, unsigned long request, ... /* void *arg */); 参数说明参数类型说明fdint已打开的设备文件的文件描述符如 /dev/tty、/dev/sda 等。requestunsigned long设备控制命令由驱动定义如 TIOCGWINSZ 获取终端大小。...void * 或 int可选参数通常是指向数据的指针如结构体或整数值。 返回值 成功返回 0 或驱动定义的非负值具体取决于 request。 失败返回 -1并设置 errno 表示错误原因如 EBADF 表示无效的文件描述符。 主要功能 终端控制调整窗口大小、获取终端属性。 网络设备配置获取/设置网卡参数。 存储设备管理如硬盘格式化、读取扇区。 自定义设备驱动交互如 LED 控制、传感器数据读取。
3.2 常用 ioctl 请求码request
sys/ioctl.h 定义了许多标准请求码例如
(1) 终端控制Terminal I/O
请求码功能TIOCGWINSZ获取终端窗口大小struct winsize。TIOCSWINSZ设置终端窗口大小。TCGETS获取终端属性struct termios。TCSETS设置终端属性。
(2) 网络设备控制Socket I/O
请求码功能SIOCGIFADDR获取网络接口 IP 地址struct ifreq。SIOCSIFADDR设置网络接口 IP 地址。SIOCGIFFLAGS获取接口标志如 UP、RUNNING。
(3) 存储设备控制Disk I/O
请求码功能HDIO_GETGEO获取磁盘几何信息struct hd_geometry。BLKRRPART重新读取分区表。
3.3 linux/i2c-dev.h 头文件详解
1.主要功能 定义 I2C 设备控制相关的 ioctl 命令 设置 I2C 从设备地址I2C_SLAVE。 执行 I2C 读写操作I2C_RDWR。 控制 I2C 总线I2C_FUNCS、I2C_SLAVE_FORCE 等。 提供 I2C 数据传输结构体 struct i2c_msg描述单个 I2C 消息读/写操作。 struct i2c_rdwr_ioctl_data用于批量传输多个消息。 支持标准 I2C 和 SMBusSystem Management Bus协议 适用于传感器、EEPROM、RTC 等 I2C 设备。
2. 关键函数原型与 ioctl 命令
(1) 设置从设备地址 ioctl(fd, I2C_SLAVE, addr); // 设置默认通信的 I2C 从设备地址 参数说明fd打开的 I2C 设备文件描述符如 /dev/i2c-1。addr7 位 I2C 从设备地址0x03~0x77。返回值成功返回 0失败返回 -1设置 errno。
(2) 执行 I2C 读写I2C_RDWR struct i2c_rdwr_ioctl_data packets;
ioctl(fd, I2C_RDWR, packets); // 执行组合读写操作 参数struct i2c_rdwr_ioctl_data 结构体 struct i2c_rdwr_ioctl_data {struct i2c_msg *msgs; // 消息数组int nmsgs; // 消息数量
}; struct i2c_msg 结构体 struct i2c_msg {__u16 addr; // 从设备地址__u16 flags; // 标志I2C_M_RD 表示读__u16 len; // 数据长度__u8 *buf; // 数据缓冲区
}; 标志位 I2C_M_RD读操作否则为写操作。 I2C_M_TEN使用 10 位地址默认 7 位。 返回值成功返回 0失败返回 -1。
(3) 查询适配器功能I2C_FUNCS unsigned long funcs;
ioctl(fd, I2C_FUNCS, funcs); // 获取 I2C 适配器支持的功能 返回值funcs 是一个位掩码表示适配器支持的功能如 I2C_FUNC_I2C、I2C_FUNC_SMBUS_READ_BYTE。
(4) 其他常用 ioctl 命令
命令功能I2C_SLAVE_FORCE强制设置从设备地址即使设备忙。I2C_TENBIT启用 10 位地址模式默认 7 位。I2C_PEC启用 SMBus 数据包错误检查PEC。
四. 获取鼠标信息
4.1 获取鼠标信息 cd /dev/input/sudo cat mouse0cdcd work/cd 03usrSpaceDriver/gedit input.c
#include linux/input.h
#include stdio.h
#include unistd.h
#include fcntl.hint main()
{struct input_event event;int fdopen(/dev/input/mouse),O_RDWR);int nread read(fd, event,sizeof(event));printf(type:%d, code:%d, value:%d\r\n, event.type, event.code, event.value);return 0;
}
gcc input.c -o input.out // 编译
./input.out // 运行
4.2 内核修改并编译
# 内核修改并编译
# 拷贝开发板的配置文件
scp root192.168.1.10:/proc/config.gz ./
# 解压配置文件config.gz
gzip -d config.gz
# 将解压后的文件移动到kernel/.config命名为.config隐藏文件
mv config kernel/.config
# 进入kernel
cd kernel/
ls
# 图形化界面选择
make ARCHarm menuconfig
# 编译内核
make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- LOADADDR0x00008000 uImage
# 若有修改则要更新五. QT基础使用
1. 新建并拷贝qt生成的python文件到开发板
# 新建qt文件
designer
# 将qt文件转换为py文件
pyuic5 -x pyqt1.ui -o pyqt1.py
# 传输到开发板上运行
scp pyqt1.py root192.168.1.10:/home/root
2. 在运行qt的python脚本之前要先添加环境变量选择自己需要的环境变量添加
# Qt-embedded需要的环境变量
# • 指定显示设备
export QT_QPA_PLATFORMlinuxfb
# • 指定输入设备触摸屏
export QT_QPA_GENERIC_PLUGINSevdevtouch:/dev/input/event0
export QWS_MOUSE_PROTOevdevtouch:/dev/input/event0
# • 指定输入设备鼠标
export QT_QPA_GENERIC_PLUGINSevdevmouse:/dev/input/event0
export QWS_MOUSE_PROTOevdevmouse:/dev/input/event0 3. 运行拷贝的pyqt脚本
python pyqt1.py
六. 内核打印Hello world 1. 编写内核模块
/* mhello.c */
#include linux/init.h
#include linux/module.h
#include linux/kernel.h
static int hello_init(void)
{pr_alert(Hello, world\n);return 0;
}
static void hello_exit(void)
{pr_alert(Goodbye, world\n);
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE(GPL);
MODULE_AUTHOR(XXX);
MODULE_DESCRIPTION(A simple Hello World Module); 2. 编写Makefile 内核模块编译为可加载模块obj-m为输出文件名根据c文件不同名称进行修改
ifneq ($(KERNELRELEASE),)
obj-m : mhello.o
else
KDIR : /home/emb-zynq/kernel/
all:$(MAKE) -C $(KDIR) M$$PWD
endif 3. 将生成的.ko文件拷贝到开发板并执行 1更新内核
# kernel/arch/arm/boot$ 将此文件下 uImage 文件 覆盖开发板 /media/card 下的uImage
scp uImage root192.168.1.10:/media/card 直接覆盖
# 重启开发板
reboot2交叉编译并拷贝.ko到开发板并执行
# 交叉编译
make ARCHarm CROSS_COMPILEarm-linux-gnueabihf-
# 也可以在当前终端添加临时环境变量再运行
# export ARCHarm
# export CROSS_COMPILEarm-linux-gnueabihf-
# make# scp 将.ko文件传入开发板
scp mhello.ko root192.168.1.10:/home/root
# 动态加载内核模块
insmod mhello.ko
# 查看加载的内核模块
lsmod
# 卸载内核模块
rmmod mhello.ko七. 内核GPIO 内核获取gpio状态
# 交叉编译
make ARCHarm CROSS_COMPILEarm-linux-gnueabihf-
# 也可以在当前终端添加临时环境变量再运行
# export ARCHarm
# export CROSS_COMPILEarm-linux-gnueabihf-
# make# scp 将.ko文件传入开发板
scp gpios.ko root192.168.1.10:/home/root
# 动态加载内核模块
insmod gpios.ko# 注册设备号
mknod /dev/gpios c 245 0
# 查看设备状态
cat /dev/gpios# 卸载内核模块
rmmod gpios.ko 内核使用led灯
# 交叉编译
make ARCHarm CROSS_COMPILEarm-linux-gnueabihf-
# 也可以在当前终端添加临时环境变量再运行
# export ARCHarm
# export CROSS_COMPILEarm-linux-gnueabihf-
# make# scp 将.ko文件传入开发板
scp led-gpios.ko.ko root192.168.1.10:/home/root
# 动态加载内核模块
insmod led-gpios.ko.ko# 注册设备号
mknod /dev/led0 c 245 0
mknod /dev/led1 c 245 0
mknod /dev/led2 c 245 0
# 点灯
./ledapp /dev/led0
./ledapp /dev/led1
./ledapp /dev/led2# 卸载内核模块
rmmod led-gpios.ko
八. 内核i2c通信mpu信息获取
8.1 input_button
编译和测试
编译button.c驱动程序和inputtest.c测试程序 修改前面例子中的Makefile运行make命令编译驱动程序button.c产生button.ko 修改并编译测试应用arm-linux-gnueabihf-gcc inputtest.c –o inputtest 下载button.ko 和inputtest到目标板。 加载设备驱动insmod ./button.ko 查看/dev/input/event*找到新增的event文件。 用cat命令查看event文件按动按键观察输出。 执行测试程序./inputtest /dev/input/event1观察输出
8.2 kmpu mount命令查看设备
练习 • 编译并加载MPU6050驱动kmpu.c观察输出结果。 • 修改并更新设备树文件system.dtb,更新后reboot • 设备树文件示例
scp root192.168.1.10:/media/card/system.dtb ./
# dtb 改 dts
dtc -I dtb -O dts system.dtb -o system.dts
# 修改system.dts
# dts 改 dtb
dtc -I dts -O dtb system.dts -o system.dtb
#重启开发板
reboot# 编译kmpu.c
make# 将kmpu.c拷贝到开发板
scp kmpu.ko root192.168.1.10:/home/root/test/0416/kmpu
# insmod加载设备
insmod kmpu.ko