- 博客(56)
- 问答 (1)
- 收藏
- 关注
原创 linux内核编程----提权creds
一、序言 阅读驱动代码的时候,看到了关于creds方面的函数,但是不知道是做什么的,经过了解,原来是用于给进程/线程提权的。 在创建线程成功以后,需要给线程访问的权限,比如普通用户,也可以是超级用户root。二、API函数 详见内核驱动中的,多的不说,主要是如下两个函数的应用。#includ
2022-05-08 23:07:53
692
原创 linux内核编程-----内核线程kthread
一、序言 在linux驱动中需要创建多线程,实现同一时刻执行多个任务。这个时候我们就需要内核机制----kthread。二、内核API1.创建线程:struct task_struct *ret = kthread_create(threadfn, data, namefmt, arg...);2.唤醒线程: 将创建好的线程句柄传入该函数即可运行线程。i
2022-05-08 22:19:05
896
原创 vim配置(嵌入式C语言开发)
一、序言 本文针对是对于嵌入式开发者,个人而言比较好用一些的配置版本二、使用方法 在家目录中添加**.vimrc**文件,将配置添加进去即可。三、.vimrc配置文件 除了一些基础配置以外,还添加了一些好用的插件:Vundle、ctags、cscope等。使用效果图如下:" Aut
2022-05-08 16:26:35
2109
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
686
原创 网络编程中为什么会需要端口号?
1.什么是端口号?操作系统为了统一管理多个网络进程,就需要设置端口号,所谓的端口号就是一个数字,对网络进程的一个编号。端口号最大值为65535。2.端口号的作用如果设备B想要与设备A进行网络通信,那么B就要找到A的设备,就是需要找到A的IP地址。但是找到A的设备以后,发现设备A中存在多个网络进程,不知道该向哪一个进程发送数据,所以出现了端口号。3.端口号的分类知名端口号 动态端口号知名端口号规定的端口号,范围 【...
2022-01-25 11:37:24
2460
原创 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
803
原创 linux驱动之输入子系统
一、输入子系统简介 输入子系统就是Linux内核专门针对输入设备创建的框架驱动。 输入子系统的主设备号都为13,我们使用input子系统处理输入设备的时候就不需要注册字符设备了。只需要定义input_device结构体即可。定义在linux/input.h中。 看结构体可知大概功能,按键的事件,按键,相对位置,绝对位置,其他,led,音频,前馈状态,开关。每一项的具体功能可以进一步追踪宏条件。比如EV_CNT都有哪些事件。struct input_dev { const char *n
2022-01-22 22:02:52
1204
原创 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
4223
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
1577
原创 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
303
原创 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
2491
原创 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
545
原创 linux驱动之工作队列workqueue
1.应用场景在中断中处理太多的操作是非常危险的,对中断的及时响应有很大的影响,在linux中我们经常会用到,来处理中断需要响应的操作。2.使用方式#include <linux/workqueue.h>static void ili210x_work(struct work_struct *work)
2022-01-10 09:54:30
429
原创 Linux驱动-----内核定时器
一、内核时间管理 硬件定时器提供时钟源,linux内核中在图形化界面配置中可以配置,我们选择最低的系统频率100Hz,使得内核负载减小。也就是说一秒钟可以产生100次中断。 在Linux内核中以全局变量jiffies记录系统从启动以来的节拍数。如果系统频率1000Hz是64位的操系统,系统超过5.8亿年就会归0,所以不用考虑绕回问题。但是32位系统,只要49天定时器就会溢出二造成绕回现象。内核提供了处理绕回的API函数。函数timeout = jiffies + (2 * HZ)
2021-12-21 12:04:24
400
原创 应用程序之按键消抖---状态机法
也就是有的人所说的查询法。什么这法那法的,还说了一大堆没用的理论,不爱多说,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
385
原创 Sqlite3数据库 C语言用法
sqlite3数据库跟sqlite的使用方式相同,因此我使用的时候照着sqlite的教学来的。1.sqlite3的数据库初始化 由于设备重新上电以后,需要重新执行代码,如果我们的代码中使用insert方式,那么开机两次,就会insert两轮数据。因此我们在设备上先创建号一张数据表。代码如下,创建一张具有六十个数据的表。在设备中执行完以后,将表格提取出来,我们的程序中只需要对其update更新表格的数据就行了。 sqlite3_open:创建一个数据库,...
2021-12-09 18:14:21
1897
原创 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
507
原创 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
4766
原创 TCP发送0x0的数据无法,接收不到0x0?
是因为在写程序的时候,习惯性地使用strlen函数,而strlen函数遇见buf中的0,也就是\0字符以后,就会将buf的长度截止掉。 因此,在使用send或者write函数时,应该不适用strlen函数计算buf的长度。...
2021-12-03 15:55:37
2008
转载 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
745
原创 Openwrt源码中创建开机自启动脚本
1.添加开机自启动脚本/openwrt/package/base-files/files/etc/init.d/目录下添加开机自启动脚本2.编译 照着其他的启动脚本写格式,ln -s链接命令这一步可以直接省掉注意:如果你发现你的固件中打开脚本,每一行后面都有"^M"的话 在源码中执行下述...
2021-09-15 09:54:08
1842
原创 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
1974
转载 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
4073
原创 编译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
913
原创 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
467
原创 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
306
原创 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
369
原创 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
901
原创 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
677
原创 15.eLcdIF驱动
一、LCD液晶屏 由玻璃板夹液晶盒,外加偏光片,滤光片等组成。液晶本是不会发光的,所以还要加一个背光灯,通过层层材料处理最后得到图像。 RGB888液晶屏,每个像素点是三个小灯,红绿蓝三原色可以组合很多颜色。其像素格式是8bit,那么三个灯就是24bit。2^24=1677w种颜色。现在还有10bit的HDR10的屏幕。二、eLCDIF 时钟信号,RGB信号线,水平同步信号,垂直同步信号,数据线。 VSYNC是垂直同步信号,当HSYNC信号出现时表示一帧像素点信号传输结束。
2020-05-30 11:11:33
454
原创 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
3067
转载 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
2316
原创 13.UART串口驱动
一、串口UART 串口看手册介绍具有异步收发功能…一大串不说了。可以将数据显示在终端打印出来,我们主要作用用于调试工具。 对于编程,只需要驱动TXD与RXD寄存器。它们分别是对于数据的收发存储的register。 对于串口内部结构,而言一个收一个发。编程而言设置时钟源以及设置各类寄存器,对于收发数据挂靠DCE/DTE接口中,我们需要使用TX_DATA,RX_DATA.。二、串口寄存器 UART_URxD寄存器保存串口接收的数据 UART_UT XD寄存器用于发送数据。
2020-05-21 18:24:49
832
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
1266
原创 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
715
原创 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
1218
原创 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
770
原创 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
1184
原创 7.有源蜂鸣器驱动
1.有源蜂鸣器 以前也接触过蜂鸣器,不过对有源无源的区别还真是不大清楚。只是知道有源是带电源的意思。而蜂鸣器中的源指代“震荡源”,当想要驱动有震荡源的蜂鸣器只需要通电就可以驱动了。而无源蜂鸣器想要驱动只通直流电是不可以驱动的,需要通2K-5K的方波才可叫。蜂鸣器驱动无非就是将GPIO的输入。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传分析电路,若想驱动BEEER,那么就需要2端是低电平。而SS8050是NPN三极管,其电气特性是给1端通高电平,那么NPN导通,则BUZZ
2020-05-17 22:26:51
6128
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
326
空空如也
linux5.4中内核的late_initcall宏函数使用问题
2022-03-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人