自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 问答 (1)
  • 收藏
  • 关注

原创 linux内核编程----提权creds

一、序言      阅读驱动代码的时候,看到了关于creds方面的函数,但是不知道是做什么的,经过了解,原来是用于给进程/线程提权的。      在创建线程成功以后,需要给线程访问的权限,比如普通用户,也可以是超级用户root。二、API函数      详见内核驱动中的,多的不说,主要是如下两个函数的应用。#includ

2022-05-08 23:07:53 601

原创 linux内核编程-----内核线程kthread

一、序言      在linux驱动中需要创建多线程,实现同一时刻执行多个任务。这个时候我们就需要内核机制----kthread。二、内核API1.创建线程:struct task_struct *ret = kthread_create(threadfn, data, namefmt, arg...);2.唤醒线程:      将创建好的线程句柄传入该函数即可运行线程。i

2022-05-08 22:19:05 804

原创 vim配置(嵌入式C语言开发)

一、序言      本文针对是对于嵌入式开发者,个人而言比较好用一些的配置版本二、使用方法      在家目录中添加**.vimrc**文件,将配置添加进去即可。三、.vimrc配置文件      除了一些基础配置以外,还添加了一些好用的插件:Vundle、ctags、cscope等。使用效果图如下:" Aut

2022-05-08 16:26:35 1976 1

原创 Linux编程之signal信号使用

signal函数两个参数,第一个参数监测信号,如果信号被调用的回调函数。函数原型如下: #include <signal.h> sighandler_t signal(int signum, sighandler_t handler);#include <sys/stat.h>#include <sys/types.h>#include <signal.h>#include <pthread.h>#in

2022-03-09 09:39:53 618

原创 网络编程中为什么会需要端口号?

1.什么是端口号?操作系统为了统一管理多个网络进程,就需要设置端口号,所谓的端口号就是一个数字,对网络进程的一个编号。端口号最大值为65535。2.端口号的作用如果设备B想要与设备A进行网络通信,那么B就要找到A的设备,就是需要找到A的IP地址。但是找到A的设备以后,发现设备A中存在多个网络进程,不知道该向哪一个进程发送数据,所以出现了端口号。3.端口号的分类知名端口号 动态端口号知名端口号规定的端口号,范围 【...

2022-01-25 11:37:24 2289

原创 Linux驱动之中断系统

一、Linux中断​ 在裸机中断中我们需要做很多工作,比如关闭MMU,Cache等配置寄存器,使能中断。但是linux内核提供了完善的中断框架,我们只需要申请中断request_irq,然后注册中断处理函数即可。使用很方便。最后还应释放中断free_irq。​ 我们还会经常使用到使能禁能中断。​ 如果有两个任务,A-B。当A先禁能中断10s,B后禁能2s,B要使能以后就会打乱A的节奏。所以要需要查看一下当前的中断状态flags,B才会决定是否要禁能2s后使能,否则A就会将系统崩溃。#inclu

2022-01-23 22:20:35 686

原创 linux驱动之输入子系统

一、输入子系统简介​ 输入子系统就是Linux内核专门针对输入设备创建的框架驱动。​ 输入子系统的主设备号都为13,我们使用input子系统处理输入设备的时候就不需要注册字符设备了。只需要定义input_device结构体即可。定义在linux/input.h中。​ 看结构体可知大概功能,按键的事件,按键,相对位置,绝对位置,其他,led,音频,前馈状态,开关。每一项的具体功能可以进一步追踪宏条件。比如EV_CNT都有哪些事件。struct input_dev { const char *n

2022-01-22 22:02:52 1151

原创 Linux驱动之i2c驱动

一、I2C简介​ I2C是很常用的总线协议。它使用两条线在主控制器与从机直接进行数据通信。一条是时钟线,一条是数据线,两条数据线都要接4.7K的上拉电阻,空闲的时候处于高电平。I2C总线的标准模式下传输速度可以达到100k/s,快速模式达到400k/s。​ 常见的I2C驱动从设备有电容触摸屏,CMOS camera ,重力传感器,EEPROM,HDMI。二、I2C的协议内容​ 起始位S:数据位电平拉低​ 停止位P:数据位拉高​ ACK1:MASTER发送完地址后,SLIVER将数据

2022-01-21 21:34:19 4126 1

原创 移植Qt到openwrt开发板中

我希望我写的文章可以帮助到你,因此我把全部过程都记录下来了,你可以不用到起到文章中查看了,而且格式也调试到查看尽量舒服一些。环境:PC机:Ubuntu16.04开发板:mipsel mt7688一、环境依赖软件$ sudo apt-get install libxtst-dev libx11-dev libxext-dev二、获取源码Qt源程序获取:https://download.qt.io/archive/qt/4.8/4.8.3/Ubuntu下选择tar.gz的程序包:qt-ev

2022-01-20 21:39:29 1375

原创 openwrt移植tsllib

1.获取tslib源码github下有一个叫做tslib的仓库2.生成configure配置文件$ ./autogen.sh3.生产Makefile文件$ ./configure \ CC=/work/test/openwrt-hiwooya/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc \ --host=mipsel-linux \ --

2022-01-19 09:02:53 237

原创 mt7620的wifi调试

1./tmp/RT2860.dat 文件进行配置wifi,字段说明详情看手册mtk_wi-fi_softap_software_programming_guide_v4.6.pdf2.启动wifi命令ifconfig ra0 up/down3.wifi驱动DEBUG查看驱动输出信息wpriv ra0 set Debug=30~50: Debug Off1: Debug Error2: Debug Warning3: Debug Trace4: Debug Info5: Deb

2022-01-18 09:11:09 2261

原创 Linux驱动之sysfs设备属性

1.创建设备文件系统属性①初始化内核设备属性其中_show , store 的回调函数用于sysfs下的cat命令以及echo命令所返回的信息。初始化的_name,从而创建了设备属性 **struct device_attribute dev_attr##_name**#define DEVICE_ATTR(_name, _mode, _show, _store) \ struct device_attribute dev_attr_##_name = __ATTR(_name, _mode

2022-01-10 11:58:11 464

原创 linux驱动之工作队列workqueue

1.应用场景在中断中处理太多的操作是非常危险的,对中断的及时响应有很大的影响,在linux中我们经常会用到,来处理中断需要响应的操作。2.使用方式#include <linux/workqueue.h>static void ili210x_work(struct work_struct *work)

2022-01-10 09:54:30 376

原创 Linux驱动-----内核定时器

一、内核时间管理​ 硬件定时器提供时钟源,linux内核中在图形化界面配置中可以配置,我们选择最低的系统频率100Hz,使得内核负载减小。也就是说一秒钟可以产生100次中断。​ 在Linux内核中以全局变量jiffies记录系统从启动以来的节拍数。如果系统频率1000Hz是64位的操系统,系统超过5.8亿年就会归0,所以不用考虑绕回问题。但是32位系统,只要49天定时器就会溢出二造成绕回现象。内核提供了处理绕回的API函数。函数timeout = jiffies + (2 * HZ)

2021-12-21 12:04:24 341

原创 应用程序之按键消抖---状态机法

也就是有的人所说的查询法。什么这法那法的,还说了一大堆没用的理论,不爱多说,show you the code。不过只适用与单按钮,如果要多按钮,需要增加掩码之类的。不喜欢if的嵌套,这种方式直观由易于阅读。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <time.h>#include <...

2021-12-09 18:24:56 326

原创 Sqlite3数据库 C语言用法

sqlite3数据库跟sqlite的使用方式相同,因此我使用的时候照着sqlite的教学来的。1.sqlite3的数据库初始化 由于设备重新上电以后,需要重新执行代码,如果我们的代码中使用insert方式,那么开机两次,就会insert两轮数据。因此我们在设备上先创建号一张数据表。代码如下,创建一张具有六十个数据的表。在设备中执行完以后,将表格提取出来,我们的程序中只需要对其update更新表格的数据就行了。 sqlite3_open:创建一个数据库,...

2021-12-09 18:14:21 1797

原创 MT7620设置GPIO输入中断

1. 创建设备节点,设备号,这些不多说了。我们要对操作集中修改。static const structfile_operations ralink_gpio_fops ={ .owner = THIS_MODULE, .unlocked_ioctl = ralink_gpio_ioctl, .open = ralink_gpio_open, .release = ralink_gpio_release,};int __init ralink_gpio_init(v...

2021-12-09 17:49:34 427

原创 C语言 TCP客户端支持掉线重连

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <assert.h>#include <time.h>#include <sys/select.h>#include <errno.h>#include <strings.h>#include <sys/typ.

2021-12-03 16:23:17 4362

原创 TCP发送0x0的数据无法,接收不到0x0?

是因为在写程序的时候,习惯性地使用strlen函数,而strlen函数遇见buf中的0,也就是\0字符以后,就会将buf的长度截止掉。 因此,在使用send或者write函数时,应该不适用strlen函数计算buf的长度。...

2021-12-03 15:55:37 1917

转载 C语言获取终端输出信息到字符串

下述例子用于获取wifi命令输出信息获取字符串,demo,非常的好用int get_wifi_essid_signal(void){ FILE* fp; char buf[100] = {0}; char command[300] = "iwlist wlan0 scan"; int ret = 0; char str[100]; char signal_level[10] ; char *q = NULL; char *signal = NULL; if((...

2021-11-13 22:42:14 652

原创 Openwrt源码中创建开机自启动脚本

1.添加开机自启动脚本/openwrt/package/base-files/files/etc/init.d/目录下添加开机自启动脚本2.编译 照着其他的启动脚本写格式,ln -s链接命令这一步可以直接省掉注意:如果你发现你的固件中打开脚本,每一行后面都有"^M"的话 在源码中执行下述...

2021-09-15 09:54:08 1644

原创 Openwrt指定dl软件包的位置

有的时候我们会获取好几个版本的软件包,最终我们把软件全部放在dl位置下,只需要通过维护一个文件夹就可以了,不需要在多个版本中各自下载自己的软件包,不仅占位置又费时间重复下载。查看rule.mk的文件,里面有一个宏DL_DIR的变量,修改其为你指定的地址即可78,79c78< #DL_DIR:=$(if $(call qstrip,$(CONFIG_DOWNLOAD_FOLDER)),$(call qstrip,$(CONFIG_DOWNLOAD_FOLDER...

2021-08-22 17:13:22 1662

转载 Openwrt使用指定版本的toolchain工具链

默认编译 openwrt 时会先编译一套 toolchain. 这个步骤耗时较长. 使用外部 toolchain 可以多个 project 共用一套 toolchain , 而且也不重再编译它了. 省时省力.make menuconfig[*] Advanced configuration options (for developers) --->[*] Use external toolchain --->│ │ --- Use external toolchain ...

2021-08-22 16:56:16 3353

原创 编译Openwrt-18.06

说明: Ubuntu:16.04 LTS一、依赖安装sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils libncurses5-dev ncurses-term zlib1g-dev gawk asciidoc libz-dev git-core uuid-dev libacl1-dev...

2021-08-12 15:29:12 731

原创 20.U-boot顶层Makefile简要分析

二、顶层Makefile前面部分分析1.递归调用make(20-29)​ 在源码内有许许多多的目录,顶层Makefile也要调用子目录(subdir)中的makefile。$(MAKE) -C subdir​ export :用于给子makefile传入变量​ unexport :用于不给子makefile导入变量​ SHELL / MAKEFLAGS :无论用不用export , 都会将变量直接传给子makefile的。MAKEFLAGS += -rR --include-dir

2020-06-07 22:52:43 387

原创 19.uboot源码目录简要说明

一、U-boot目录主要分析1.目录​ Uboot编译以后会生成一些文件,​ 1.arch存放相关架构有关的东西,存放镜像源文件,设备树文件。相应编译出架构的文件夹的boot有zImage/uImage,boot/dtb/下有设备树文件存放。arm/cpu/中有uboot.lds的链接脚本​ 2.board存放开发版相关的东西,存放有freescale公司的,我的开发版是nxp,原freescale的。所以在board/freescale/mx6ullevk/。我们需要查看这个目录下的配置文件

2020-06-07 22:51:04 252

原创 18.Uboot命令使用

一、uboot启动1.烧写​ 为了便于u-boot的调试,使用SD卡烧写u-boot程序。使用裸机程序的方法。将SD卡插入虚拟机读到SD卡后,对SD卡进行分区。sudo fdisk /dev/sdb #进入了分区模式p #查看分区d #删除分区n #进行分区建立两个分区 默认,主分区,1分区,default默认,主分区,2分区,default​ 分区好以后,烧录u-boot.imxsudo dd if=u-boot.imx of=/dev/sdb bs=512 seek=2

2020-06-07 22:49:40 310

原创 17.Uboot编译原理

一、什么是UBoot​ 是一个复杂的综合的裸机程序,支持各种。UBoot就是一个Bootloader,用于启动linux系统的程序,它是上电以后的第一个程序。​ 它最重要的就是初始化DDR,linux在DDR中运行的,由于Linux内存比较大,放到内部的ROM中是远远不够的。Linux镜像一开始存在EMMC,NAND FLASH , 等外置存储中。那么我们需要将linux镜像从外置存储拷贝到DDR中,就需要Uboot程序来做。主要为系统启动做准备。Uboot获取​ 1.https://ftp.

2020-05-30 11:27:12 839

原创 16.系统镜像烧写

一、Windows下OTG烧写​ 在Windows下使用NXP提供的mfgtools烧写系统。使用开发版的OTG模式下,将拨码开关的1,2bit分别是Off , ON。MFGTools工具会向开发版下载一个LInux系统,然后再来完成烧写工作。mfgtools工具​ 工具文件夹内部的vbs就是烧写脚本。将系统烧到EMMC中去。​ 在/mfgtools/profile/linux/OS Firmware/firmware中存放设备树文件。给DDR中下载firmware镜像文件​ 在/mfg

2020-05-30 11:24:29 616

原创 15.eLcdIF驱动

一、LCD液晶屏​ 由玻璃板夹液晶盒,外加偏光片,滤光片等组成。液晶本是不会发光的,所以还要加一个背光灯,通过层层材料处理最后得到图像。​ RGB888液晶屏,每个像素点是三个小灯,红绿蓝三原色可以组合很多颜色。其像素格式是8bit,那么三个灯就是24bit。2^24=1677w种颜色。现在还有10bit的HDR10的屏幕。二、eLCDIF​ 时钟信号,RGB信号线,水平同步信号,垂直同步信号,数据线。​ VSYNC是垂直同步信号,当HSYNC信号出现时表示一帧像素点信号传输结束。​

2020-05-30 11:11:33 383

原创 14.DDR3初始化

一、DDR内存SRAM:内部随机存储器,速度高,可以与CPU同频,通常作为内部RAM或者是Cache使用。但是内存小,成本高。SDRAM:同步动态随机存储器,第四代的SDRAM发展了好几代到了DDR4,开发版使用的是DDR3。DRAM:动态随机存储器,内部存储单元的以电容电荷表示数据,1代表有电荷,0代表无数据。DRAM结构简答,所以成本低,集成度高。但是存取速度不如SRAM。​ 2.DDR​ 常见频率100MHZ,133MHZ,166M,200MHz。​ 计算容量:行地址位row=

2020-05-30 11:00:25 2849

转载 Linux下检测内存泄漏工具ASan

转载于:https://mp.weixin.qq.com/s?__biz=MzU2MTkwMTE4Nw==&mid=2247489292&idx=1&sn=a77388b3d40b9ea98d3d232319233e22&chksm=fc70ece0cb0765f6df56bc03f9ce732a448a260661d515370aa4b952b6d001edc1ba593480eb&mpshare=1&scene=23&srcid=&sha

2020-05-26 12:08:22 2133

原创 13.UART串口驱动

一、串口UART​ 串口看手册介绍具有异步收发功能…一大串不说了。可以将数据显示在终端打印出来,我们主要作用用于调试工具。​ 对于编程,只需要驱动TXD与RXD寄存器。它们分别是对于数据的收发存储的register。​ 对于串口内部结构,而言一个收一个发。编程而言设置时钟源以及设置各类寄存器,对于收发数据挂靠DCE/DTE接口中,我们需要使用TX_DATA,RX_DATA.。二、串口寄存器​ UART_URxD寄存器保存串口接收的数据​ UART_UT XD寄存器用于发送数据。

2020-05-21 18:24:49 762 1

原创 12.GPT定时器

一、GPT定时器​ 以前的延时,通过空指令进行延时,不准确。当修改时钟频率后,才用延时就会有很大的变动。而6ULL的GPT是一个高精度定时器装置。​ GPT是一个32bit的向上计数器,有两个输入捕获通道,三个输出比较通道。有一个12分频器。​ GPT有两种模式restart和free-run模式。restart模式:定时器的值与寄存器的某个值比较相等就会重新开始计时。它是捕获专有的。free-run模式适用于比较输出的模式。二、寄存器​ CR寄存:bit[0]:模块使能bit[1]

2020-05-21 18:23:12 1124

原创 11.EPIT定时器

一、原理介绍EPIT​ 1.是一个计数器,他没有其他花里胡哨的功能,仅仅是一个向下计数器。​ 2.时钟源选择。​ 3.选择完时钟源以后进行分频,是一个12bit的分频器。​ 4.分频以后获得计数器。load会向下加载,compare会与counter比较。​ 5.进入cmp比较器中。要设置CR寄存器的模式,有两种模式,set-and-forget模式是当counter减到0以后会停止重新装载计数器的值;free-running模式是counter减到0以后就不再运行了。二、寄存器设置

2020-05-21 18:18:34 647

原创 10.IMX6ULL外部中断

一、STM32的中断系统​ 代码从0x00000000运行。32设置连接首地址0x8000000的地方存放了中断向量表,因此要从0x8000000的地方开始运行。需要告诉soc内核,要设置中断向量偏移。设置SCB的VTOC寄存器为新的中断向量表起始地址,内部指向各种中断的函数名。​ 但是Cotex-A的中断向量表只有几个,我们主要使用的是IRQ。二、6ULL中断系统1.GIC控制器​ GIC提供了开关中断,设置中断优先级等等。6ULL有1020个中断号,用于向CPU interface发送信

2020-05-21 18:16:37 1110

原创 9.I.MX6ULL时钟树

1.硬件原理图​ 1.32.768Khz的晶振,供给RTC使用​ 2.在6U中T16与T17IO口中接了一个24MHz的晶振2.I.MX系统时钟分析1.7路PLL​ 为了方便升成时钟,从24MHz晶振中声称7路PLL,每一路又升成PFD_PLL。​ 配置详见时钟树。还要学会看RM手册进行配置频率,具体看下面。2.配置主频​ 我们想要配置内核主频528MHz。​ 我们的目标是配置ARM内核主频,首先第一步就是配置CLOCK SWITCHER的PLL1,之后进行CACRR寄存器的配置

2020-05-17 22:35:50 685

原创 8.按键输入

1.按键输入​ GPIO可以输出,也可以输入。按钮就是通过输入驱动的,通过按下按键,导致电路联通,引脚收到信号,告诉CPU。2.电平分析:​ 开发版一共四个按键,SW1,SW2,SW3,SW4。其中SW1,3,4有特殊功能,因此我们对SW2进行配置。由于3端3.3V,因此只需要配置SNVS_TAMPER1为高电平即可触发SW2;​ 根据电路我们需要知道,正常情况下我们KEY的SNVS_TAMPER1口需要时低电平的。当SW2按下后,就能采集到高电平,因此我们只需要获取寄存器的值就可以读取是否

2020-05-17 22:30:41 1063

原创 7.有源蜂鸣器驱动

1.有源蜂鸣器​ 以前也接触过蜂鸣器,不过对有源无源的区别还真是不大清楚。只是知道有源是带电源的意思。而蜂鸣器中的源指代“震荡源”,当想要驱动有震荡源的蜂鸣器只需要通电就可以驱动了。而无源蜂鸣器想要驱动只通直流电是不可以驱动的,需要通2K-5K的方波才可叫。蜂鸣器驱动无非就是将GPIO的输入。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传分析电路,若想驱动BEEER,那么就需要2端是低电平。而SS8050是NPN三极管,其电气特性是给1端通高电平,那么NPN导通,则BUZZ

2020-05-17 22:26:51 5817 1

原创 6.模块化工程创建

一、模块化工程管理​ 即模块化编程,将同属性文件分存管理机制。使得杂乱无章的工程变得有条有序,干净整洁的目录界面,分工有序。不同的目录下存放同一类​ 创建project , bsp , include, obj目录。bsp下设各个外设的子目录。​ 将project目录下存放main.c 与start.s等主要文件;bsp目录存放外设程序;include目录下存放芯片寄存器的头文件;obj存放编译后升成的.o文件。​ 整理好工程以后,需要配置头文件。利用vscode的c/c++:ed插件,可

2020-05-17 22:24:38 279

空空如也

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

TA关注的人

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