自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 资源 (11)
  • 收藏
  • 关注

原创 56 linux内核里声明I2C设备的方法

I2C控制器驱动好后,由i2c_adapter对象来描述, 我们只需通过函数调用控制器来实现数据传输就可以了。 但i2c控制器上接的i2c设备,需要我们来声明才可以.在linux内核里,每个i2c_client对象表示一个i2c硬件设备"include/linux/i2c.h"struct i2c_client { unsigned short flags; //没用. 如设备地址为10

2017-06-30 14:31:22 1660

原创 55 linux内核里基于GPIO口的I2C控制器驱动

当SOC里的I2C控制器不稳定,或I2C控制器不够用时,我们可以基于GPIO实现I2C控制器的功能.在linux内核里已提供了相应的代码,是一个平台驱动,只需写平台设备描述相关资源即可. make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- Device Drivers ---> <*> I2C su

2017-06-30 11:49:44 1311 5

原创 54 OrangePi linux内核里的i2c控制器驱动

在全志H3平台里的”TWI Controller”就是I2C控制器. 共有4个i2c控制器 script.bin里的i2c控制器配置 :[twi0]twi_used = 1twi_scl = port:PA11<2><default><default><default>twi_sda = port:PA12<2><default><default><default>[twi1]twi_u

2017-06-30 11:11:50 2074

原创 53 I2C传输协议

同步: 共用一个时钟信号进行数据传输。 如一个时钟周期信号可进行收发一位数据. 即按已约定好的方式进行工作,工作开始前不需要再发出通知信号 异步: 工作开始前需要再发出通知信号。 没有共用时钟信号,收发两端都有自己的时钟信号(uart: tx, rx, gnd, cts, rts) 中断是异步的 ////////// 主机(master): 发起操作方,一般是i2c控制器

2017-06-29 17:03:40 2110

原创 52 linux设备驱动模型的sysfs接口

除了在proc目录里实现驱动的简单接口外,还可以/sys目录下实现驱动接口//在linux内核里很多结构体都包含有kobject成员. 通常每个kobject对象在/sys/目录下有对应的目录struct kobject { const char *name; //显示的目录名 struct list_head entry; //内核里用于管理kobject对象用,通

2017-06-29 14:10:12 1579 3

原创 51 linux设备驱动的proc调用接口

前面实现的设备驱动提供给用户调用的接口基本都是基于字符设备接口, 用户需要应用程序来调用设备驱动. 但一些比较简单功能的设备驱动,如只需读写功能,可以使另一种用户接口.在系统下的proc目录, 有些文件是可读写的,而且可通过读写改变系统的配置,也可以改变设备驱动里的设置. 如改变printk的输出级别”echo “11 8” > /proc/sys/kernel/printk”如硬件功能比较简单

2017-06-29 11:00:32 1868 1

原创 50 使用linux内核源码里的led驱动<LED Support for GPIO connected LEDs>

这个设备驱动适用于,连接到一个IO口的led灯. 需要在linux内核配置里选上相关的配置。在内核源码目录下: make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- Device Drivers ---> [*] LED Support ---> <*> LED Class

2017-06-28 17:03:30 3034

原创 49 使用linux内核源码里的矩阵键盘驱动<GPIO driven matrix keypad support>

这个设备驱动适用于,矩阵键盘的每行,每列都是接到一个IO口, 行线接的IO口有中断功能. 需要在linux内核配置里选上相关的配置。在内核源码目录下: make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- Device Drivers ---> Input device support --->

2017-06-28 15:42:58 3574

原创 48 使用linux内核源码里的按键轮询驱动<Polled GPIO buttons>

这个设备驱动适用于,每个按键是连接到一个io口, 驱动里是通过定时查询io口的电平来确定按键的状态的,不使用io口的中断功能/ 需要在linux内核配置里选上相关的配置。在内核源码目录下: make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- Device Drivers ---> Input devi

2017-06-28 13:25:14 2981

原创 47 使用linux内核源码里的按键驱动<GPIO Buttons>

这个设备驱动适用于,每个按键是连接到一个io口, 而且这个io口还有中断功能的需要在linux内核配置里选上相关的配置。在内核源码目录下: make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- Device Drivers ---> Input device support --->

2017-06-28 10:41:05 4498

原创 46 dht11/dht12 linux platform驱动实现

在全志h3平台上,外部中断的时钟源需要通过设置相应的配置寄存器选择高频率的时钟源才可以用中断的方式来获取数据位的时间. 为了保证平台驱动代码的可移值性,设置时钟源的代码应在平台设备这边完成.在头文件里, 封装出结构体类型mydht12_pdata_t用于平台设备里指定,平台驱动应当对此平台设备所需作的初始化/结束工作, 也就是由平台驱动在probe和remove函数里调用mydht12.h#if

2017-06-27 15:18:35 1517

原创 45 超声波测距模块的linux platform驱动模型实现

//用一个头文件封装结构体表示超声波测距模块所用的io口 distancer.h#ifndef __DISTANCER_H#define __DISTANCER_Htypedef struct { int trigger_io; //表示trigger的引脚 int echo_io; //捕捉数据的引脚 }mypdata_t;#endif /* __DISTAN

2017-06-26 17:20:47 1621 15

原创 44 linux内核里的platform设备驱动模型

内核里的设备驱动模型分成三部分: bus(struct bus_type), device(struct device), driver(struct device_driver)我们最常用的设备驱动模型是基于上面的模型封装出来的,叫platform驱动模型,也是分成三部分: platform_bus_type(struct bus_type) , 内核里已实现好这个总线,并且总线匹配函

2017-06-26 16:41:39 1336

原创 43 linux的驱动模型,实现设备驱动代码的可移植性

struct bus_type 的对象来表示一个总线, 管理挂载到总线上的设备与设备驱动, 包括它们的配对 struct device 的对象来表示一个挂在总线上的设备, 描述硬件部分的资源(包含IO口, 中断号,键码等) struct device_driver 对象来表示一个挂在总线上的设备驱动, 描述硬件的驱动方法注意: bus总线在linux内核里仅仅是用一个结构体对象来表

2017-06-24 17:40:31 1647

原创 42 linux内核里的输入子系统分析

linux里的子系统: linux内核里把某种功能类型的源码划分成一个源码模块, 也就是把一类相关的源文件集中起来封装出的功能模块. 如内核源码目录下”drivers/input”里就是输入子系统的源码, “drivers/i2c”就是i2c子系统./////////// 输入子系统的主要入口在”drivers/input/input.c”源文件:static const struct file_

2017-06-24 15:51:08 735

原创 41 linux标准输入设备之矩阵键盘驱动的实现

准备知识点: 原子位操作 , linux输入设备的应用程序编程在linux内核里用struct input_dev的一个对象来表示一个输入设备. 用一位二进制表示是否支持相应的功能, 多种功能需要多位, 用数组来表示所需的多位二进制数.#include <linux/input.h>struct input_dev { //这部分内容可"cat /proc/bus/inp

2017-06-24 10:55:15 2757

原创 40 矩阵键盘在linux内核里的驱动实现

行线: MCU_SPICLK0, MCU_SPIFRM0列线: MCU_SPITXD0, MCU_SPIRXD0当按键按下时,它的1脚和2脚接通,行线与列线就会接通.判断是否有接键按下或松手: 首先,行线有接上拉电阻 ,默认高电平。列线全部输出低电平. 如K14按下时, 列线SPITXD0与行线SPICLK0接通, 行线的电平就会被列线输出的电平影响,变成低电平(有下降沿). 当K14松手

2017-06-23 16:06:49 2441

原创 39 解决全志h3 linux内核源码里的关于script.fex的bug

在script.fex里有关于io口的配置: Port:端口+组内序号<功能分配><内部电阻状态><驱动能力><输出电平状态> [gpio_para] gpio_used = 1 ;gpio_num = 30 ;gpio_pin_1 = port:PL10<1><default><default><1> ;gpio_pi

2017-06-23 10:53:27 3285 1

原创 38 全志平台的script.bin在linux内核里的应用分析

在全志平台里,script.bin用于指定SOC控制器和GPIO等相关的配置. script.bin是由script.fex用工具转换得来.在uboot启动系统时, uboot的环境变量bootcmd为: bootcmd=ext4load mmc 0:1 0x43000000 /script.bin; ext4load mmc 0:1 0x42000000 /uImage; bootm 0x420

2017-06-22 14:30:18 3580 7

原创 37 linux内核的中断底半部实现方法

linux内核里的中断处理: 在内核当发生中断时,会记录哪个中断产生并把中断相应的处理函数加入一个处理队列里, 直到把所有同一时间发生的中断全部记录好后,处理队列里的函数才会逐一得到调用。所以当一个中断处理函数处理过久时,就有可能影响它后面的中断处函数的执行时机。我们用的中断处理函数是可以被中断信号打断的。中断处理函数需要注意: 1.不能执行时间长的代码. 注意printk...

2017-06-21 16:56:21 1359 3

原创 36 linux内核里的HZ定时器与timer_list定时器

在linux内核里的设备驱动常常用到定时器定时器功能,而硬件上的定时器通常只有几个,如果每个设备驱动使用一个硬件定时器,那肯定是不够用,所以在linux内核里会把一个硬件定时器的功能扩展成多个软件定时器. 例如: 硬件定时器每秒钟触发检查一次,那么就可以设置如3秒,4秒,10秒的软件定时器.内核里的HZ定时器就是基于一个硬件的定时器来实现的. 它与内核源码目录的”.config”里的”CO...

2017-06-21 11:45:12 3060

原创 35 红外接收头在linux内核里的驱动

红外是一种光, 对于人类是不可见的光,但摄像头可以捕捉到红外光.红外可用不同的频谱来表二进制的0和1(高/低电平). 传输分成发送端(遥控器),接收端(红外接收头)发送端发出表示高低电平的不同的光, 接收端收到红外光后还原成对应的高低电平来表示二进制的0和1.发送端可由专门的红外发射芯片来实现,如图: 红外发射芯片会自动扫描矩阵键盘电路,根据不同的键码,生成一串二进制数据,再按每位的二进制数据用

2017-06-20 14:38:10 6157 2

原创 34 dht12单总线方式的Linux驱动及解决H3丢失中断的问题

DHT12温湿度传感器有两种工作方式, 一种是用I2C接口。 一种是单总线(也就是用一个GPIO口, DHT11只能用这种方式).DHT12精度比DHT11的高,温湿度都有小数部分的。dht12的测量范围(-20 ~ 60), dht11(0 ~ 50)应DHT12单总线的工作方式可以完全兼容DHT11,下面的图是从DHT11手册里抠出来的: 通过上图可得知,工作流程: 发开始信号 —> D

2017-06-19 11:50:28 2514

原创 33 全志GPIO口的脚本配置及超声波测距模块的linux驱动

linux内核有gpiolib标准的gpio操作接口. 但这套接口只能配置输入,输出,获取或设置IO口的电平. 但GPIO口是多功能, 还有上/下拉功能. 全志的GPIO额外的配置在script.bin里指定(有些SOC是提供额外的函数接口来配置).script.bin是由sdk里的工具fex2bin把fex配置文件生成bin文件. bin文件也可由工具bin2fex转成fex文件.在script

2017-06-19 10:50:07 4486

原创 32 linux内核里的中断处理

中断: CPU在执行过程中, 硬件发生状态变化时, 打断CPU程序的执行,先做硬件状态变化时需要处理,再接着执行原程序. 中断其实就是由硬件主动来告诉我们它的状态发生改变了, 而不需要一直轮询硬件状态 .arm里有异常向量表,当发生中断异常,不是执行0x18就是执行0xffff0018上的代码指令.也就是不管是什么中断,都是由在这地址上的代码来处理.arm里只有一个中断异常功能,都由SOC里的中

2017-06-13 14:56:08 1364 1

原创 31 completion完成量,wait_queue_head_t等待队列和epoll

完成量, 功能与信号量差不多, 最大不同可以唤醒多个休眠的进程或线程#include <linux/completion.h>struct completion { unsigned int done; //done表示资源,上锁时done--. 当done为0时再上锁则会安排调用进程或线程进入休眠. //解锁时, done++ wait_queue_

2017-06-13 10:50:19 1769

原创 30 spinlock_t自旋锁和semaphore信号量

自旋锁是一直循环检查, 直到锁上为止(锁不上也不会让进程休眠)。自旋锁只有两种状态,可锁上和锁不上. 锁上后确保执行的代码为原子操作, 直到解锁为止. 注意不能长时间锁上自旋锁, 不能在临界区里休眠.spinlock_t 自旋锁 #include <linux/spinlock.h>spinlock_t mylock;spin_lock_init(&mylock); //初始化自旋锁, 初始

2017-06-12 17:10:59 1127

原创 29 mutex互斥锁

在linux内核里用struct task_struct 的一个对象描述一个进程和线程:#include <linux/sched.h>struct task_struct { ... volatile long state; /*其实进程线程是否休眠就是改变这个状态 -1 unrunnable, 0 runnable, >0 stopped */ pid_t pid;

2017-06-12 14:48:59 1034 1

原创 28 atomic_t原子数与原子位操作

假如驱动里实现对write操作进行计算次数,当进程读操作时输出次数. test.c:#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/miscdevice.h>int count = 0;ssize_t myread(struct file *fl, char __use

2017-06-12 10:36:13 1456

原创 27 miscdevice设备驱动应用及实现原理

miscdevice是字符设备驱动的简化版本,方便实现一个简单的字符设备驱动.#include <linux/miscdevice.h>struct miscdevice { int minor; //指定次设备号,次设备号为255则会自分配空闲的次设备号. 主设备已固定为10. //次设备号在(0~255)之间. const char *name; //名字

2017-06-11 17:25:13 1380

原创 26 register_chrdev函数

static inline int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops){ return __register_chrdev(major, 0, 256, name, fops);}///int __regis

2017-06-11 15:48:40 1116

原创 25 mdev与驱动源码里创建设备文件的实现

前面设备驱动备加载后,都需要用命令”mknod”来创建出设备文件. 其实内核里有接口在驱动源码里实现创建出设备文件.首先busybox作的嵌入式文件系统里有提供”mdev”命令.(有些系统移植”udev”,工作方式有区别,但功能差不多)“mdev –help”命令执行输出的信息:mdev -s is to be run during boot to scan /sys and populate /

2017-06-11 14:33:57 1109 2

原创 24 ioctl的自定义命令

系统调用ioctl函数的作用: 用户进程用于通过相应的设备驱动来获取或者设置硬件状态.ioctl ---> kernel ---> cdev.fops->unlocked_ioctl(...)在字符设备驱动里, 其中unlock_ioctl函数原形:long (*unlocked_ioctl) (struct file *fl, unsigned int cmd, unsigned long ar

2017-06-11 10:35:34 3822 2

原创 23 类型的封装(内核里的继承)

#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/slab.h>#include <asm/uaccess.h>#define MYMA 1234#define MYMI 7788#define COUNT 3 //三

2017-06-09 17:30:36 783

原创 22 虚拟文件的实现

在驱动里用数据缓冲区代替文本文件的数据存取. 实现代码test.c:#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/slab.h>#include <asm/uaccess.h>#define MYMA 1234#de

2017-06-09 15:56:16 1414 2

原创 21 用户进程操作GPIO

首先用户进程是不可以直接操作硬件,只能通过调用设备驱动,让设备驱动来操作硬件. 设备驱动又可以实现一个字符设备驱动接口让用户进程来调用.如让用户进程通过ioctl来控制板上的led灯(PA(15).驱动源码test.c:#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/cd

2017-06-09 11:36:46 1311 8

原创 20 linux字符设备驱动相关的函数及参数

当用户进程open设备文件时, 内核会根据打开的设备文件的设备号找到对应的cdev对象,检查cdev.ops->open, 如果不为空,则调用驱动里的open函数,如为空,内核直接返回fd.//注意用户进程打开设备文件得到文件描述符不是由设备驱动里指定的,设备驱动里的open函数仅仅是告诉内核是否已正常打开.用户进程: app: open ---> kernel ---> cdev.o

2017-06-08 17:35:08 1478 1

原创 19 linux字符设备驱动

记得内核里是用面向对象的思想来实现的。但不是完全面向对象. 在linux内核里使用”struct cdev”类型的一个对象来描述一个字符设备驱动。#include <linux/cdev.h>struct cdev { struct kobject kobj; //内核用于管理字符设备驱动, kobject就是内核里最底层的类. 内核里会自动管理此成员. struct

2017-06-08 11:49:50 1559 1

原创 18 linux字符设备驱动之设备号

设备驱动通常是给用户进程来调用的, 但用户进程通过什么来调用驱动? 最常用的是设备驱动里实现字符设备驱动, 实现后在”/dev”目录里提供一个设备文件, 然后用户进程就可以通过操作设备文件来调用驱动.如pc上的uart设备文件: crw-rw—- 1 root dialout 4, 64 Jun 8 09:20 /dev/ttyS0 crw-rw—- 1 root dialout 4, 65

2017-06-08 10:32:44 1753 1

原创 17 增加驱动源码到Linux内核里

1). 内核源码的配置项 在linux内核源码目录下,进行配置时: make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 上面命令执行,它又会调用: scripts/kconfig/mconf Kconfig //其中"scripts/kconfig/mconf"是一个专门在终端上显示界面的程序

2017-06-07 11:32:59 1615 2

基于QCamera, QTcpServer实现网络视频监控

基于QCamera, QTcpServer实现网络视频监控. 支持多客户端. 文档说明: http://blog.csdn.net/jklinux/article/details/75072993

2017-07-13

qt mp3录音程序

qt里简单的mp3录音程序,使用lame编码库. 程序执行时开始录音并编码成mp3存放在”/my.mp3”, 直到程序退出执行 说明文档: http://blog.csdn.net/jklinux/article/details/72815790

2017-05-31

ffmpeg桌面图像h264编码并封装avi

ffmpeg桌面图像h264编码并封装avi. http://blog.csdn.net/jklinux/article/details/72519344

2017-05-19

ffmpeg摄像头数据h264编码并封装avi

ffmpeg摄像头数据h264编码并封装avi http://blog.csdn.net/jklinux/article/details/72478004

2017-05-18

原创 qt 组播实现的屏幕共享程序 

原创qt 组播实现的屏幕共享程序. 更多例子: blog.csdn.net/jklinux 

2017-05-16

原创 qt数据库操作简例

原创 qt数据库操作简例 教程: http://blog.csdn.net/jklinux/article/details/72081872

2017-05-15

qt网络组播程序 

qt网络组播程序 

2017-05-15

qt实现的tcp网络聊天室

qt实现的tcp网络聊天室

2017-05-14

qt录屏程序源码

qt录屏程序源码

2017-05-12

qt贪吃蛇游戏源码

qt贪吃蛇游戏源码

2017-05-12

qt贪吃蛇源码

2017-05-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除