自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 收藏
  • 关注

原创 git和github

git指令git基础操作Linux安装git

2024-04-16 00:34:22 336

原创 图片解码显示

本文主要探讨基于s5pv210实现图片解码显示项目。项目概述:硬件:s5pv210(已移植uboot,kernel,busybox,已搭建tftp,已挂在ntfs)软件:ubuntu14(已搭建tftp,搭建ntfs) 项目功能:基于s5pv210实现对bmp,jpeg,png三种图片的解析和显示,并且支持点击触摸屏两侧实现图片翻页 项目文件架构:(文件具体功能可阅读RADEME(后面)) png库移植 jpeg库移植 zlib库移植

2024-02-05 19:48:03 418

原创 linux驱动(八):block,net

块设备驱动:设备I/O操作,向块设备发出请求(request结构体描述),请求速度很慢,内核提供队列机制把I/O请求添加到队列中,提交请求前内核会先执行请求合并和排序以提高访问的效率,I/O调度程序子系统提交I/O请求,挂起块I/O 请求,决定队列请求顺序和派发请求到设备。块设备单位:扇区(Sectors):1扇区为512(倍)字节,块(Blocks):1块包含1个或多个扇区,段(Segments):若干相邻块组成,页(Page):内核内存映射管理基本单位。block_device:块设备实例。

2024-01-21 20:36:58 439

原创 linux(七):I2C(touch screen)

遍历 __i2c_board_list上的i2c_devinfo结构体,比较i2c_devinfo->busnum与适配的编号,匹配则调用i2c_new_device注册。i2c_match_id通过设备与设备驱动名字和i2c_device_id依次匹配,总线层的probe为设备client层的probe。I2C总线驱动:I2C适配器(I2C控制器)控制,用于I2C读写时序(I2C_adapter、i2c_algorithm)挂接与i2c_driver匹配成功的i2c_client(设备)

2024-01-20 19:12:55 927

原创 linux驱动(六):input(key)

核心层:连接设备驱动层和事件处理层,为设备驱动层提供输入设备驱动接口(struct input_dev)以及输入设备驱动注册函数(input_register_device),为事件处理层提供输入事件驱动接口,通知事件处理层对事件处理。将要注册input_dev驱动设备放在input_dev_list链表中,调用input_attach_handler函数,将每个input_handle的id_table进连接接。input_table为input_register_handler函数注册时填充。

2024-01-17 21:18:48 938

原创 linux驱动(五):framebuffer

struct s3c_platform_fb:结构体变量是platform设备私有数据(platform_device.device.platform_data)数组指针的每个成员对应一个fb_info结构体指针(每个设备的描述信息,#define FB_MAX 32),数组下标对应次设备号。显存和可见可视区域偏移量。

2024-01-14 14:44:36 1037

原创 linux驱动(四):platform

match为设备和驱动匹配函数,uevent内核向用户通知事件,probe探测函数,remove移除函数,shutdown关闭函数,suspend挂起,resume唤醒,struct dev_pm_ops *pm;name总线名称,struct bus_attribute,struct device_attribute,struct driver_attribut为总线,设备,驱动属性和方法。minor次设备号,name设备名,fops设备操作函数,this_device当前设备指针。

2024-01-10 00:32:53 956

原创 linux驱动(三):gpiolib

leds_init中创建了leds类(/sys/class/leds),led_class_attrs数组内容为/sys/class/leds/目录里的文件,该文件为内核向应用层提供的操作接口(类似设备文件)写方法:void (*brightness_set)(struct led_classdev *led_cdev,enum led_brightness brightness);

2024-01-07 18:34:44 947

原创 linux驱动(二):led补

udev机制流程:kernel(class_create,class_destroy,device_create,device_destroy)-->udev(mdev,应用层)-->/sys/class/设备类/设备。驱动主次设备注册和取消,udev(mdev)机制,静态和动态映射操作寄存器。动态映射结构体方式操作寄存器 ,内核寄存器读写接口

2024-01-03 01:07:16 763

原创 linux驱动(一):led

printk为内核中包含打印级别的功能的函数,/proc/sys/kernel/printk可查看当前系统的打印级别,高于打印级别未打印出的信息用dmesg查看。__init是宏定义,__init将修饰函数放入.init.text段,内核启动时加载.init.text段模块函数初始化。major为设备驱动编号,为0则为自动分配,其他为静态注册(/proc/devices可查看驱动编号)字符设备软件是以字节为单位进行操作的,块设备,块设备是以块(多字节)为单位操作,网络设备为网卡驱动。

2023-12-31 22:13:08 983

原创 linux系统和网络(四):网络

编写client和server,server用于存储个人信息,client下发个人信息增删改查等信息到server,server执行并反馈结果。参考本博客其他文章:基础网络知识,socket网络编程,基于socket的聊天室和简易ftp。NAT是局域网主机发送数据包给外网将主机内网IP转换为外网IP。DNS实现域名和IP地址之间转换。网段 = IP地址 & 子网掩码。路由器是局域网和外部网络通信出入口。

2023-12-25 22:42:29 452

原创 linux系统和网络(三):IO,信号,信号量,线程

sigaction可设置新捕获函数和获取旧的捕获函数,signal须在新捕获函数中获取旧捕获函数。select和poll(多路复用IO):外部阻塞式,内部非阻塞式自动轮询多路阻塞式IO。内核挂起,进程暂停运行,交出CPU给其他进程(阻塞住),需被信号唤醒。存储映射IO(mmap):共享内存,提高效率(LCD显示和IPC间共享内存)进程:CPU时分复用,实现多任务系统需求,进程间切换开销大,通信效率低。阻塞IO:wait、pause、sleep、read、write等。线程创建,退出,回收,分离,id。

2023-12-24 15:18:53 431

原创 linux系统和网络(二):进程和系统时间

linux系统记录时间:内核开机启动读取RTC硬件获取初始基准时间,存储该基准时间对应jiffies值,系统运行每节拍,jiffies加1,根据jiffies加UTC(1970-01-01 00:00:00 +0000)可获得时间点,RTC在关机后记录节拍,用于开机后的点时间准确。fork前为父进程空间,子进程继承父进程的资源(fork前),pid=0为子进程空间,pid>0为父进程空间,其余为公共空间,子进程继承父进程fd(覆盖写),父子有独立的pcb。

2023-12-22 22:18:41 1011

原创 linux系统和网络(一):文件IO

文件描述符是数字,打开文件时,系统在内存中构建数据结构来表示动态文件并返回数字作为文件描述符,该数字和动态文件数据结构挂钩绑定,API对描述符操作可实现对文件操作。文件存在块设备中为静态文件,open打开文件,内核在进程中建立打开文件的数据结构在内存中用于记录文件的文件参数,开辟一段内存用于存放内容,将静态文件转为动态文件。重复打开同一文件,多个fd数值不同且有各自的文件指针,但表示同一文件,用这些fd同时对文件写入,后一个写入会覆盖前一个,加O_APPEND可解决覆盖。

2023-12-18 23:28:53 1069

原创 根文件系统(二):busybox

parse_inittab(init.c)函数解析/etc/inittab再执行sysinit,wait,once后死循环执行respwan和askfirst。PATH定义程序路径,export导出为环境变量,默认为/bin /sbin /usr/bin /usr/sbin。用户登录在inittab执行/bin/sh生成shell界面,故添加/bin/login或/sbin/gettty登录功能。挂载根文件系统/linuxrc成功,找不到/etc/init.d/rcS和/dev/tty2等文件。

2023-12-16 16:16:00 829

原创 根文件系统(一):基础

VFS是虚拟文件系统(FAT、NTFS、ext2、ext3、jffs2、yaffs2、ubi)用于管理块设备,通过文件系统将对扇区的访问变成对目录和文件名的访问且提供访问和操作文件的API,且同一API可适用于对不同格式的文件的操作。存储设备(flash等)是分块(扇区),访问存储设备是按块号 (扇区号)来访问,文件系统(软件)对存储设备扇区进行管理,将对扇区的访问变成对目录和文件名的访问。根文件系统init进程的应用程序和其他应用程序,提供根目录、etc、bin等目录以及shell命令。

2023-12-15 22:59:12 383

原创 kernel(三):kernel移植

每个mach-xxx.c文件定义一个机器码machine_desc结构体变量且结构体变量被定义到段(.arch.info.init)修改网卡地址和中断号(arch/arm/plat-s5p/devs.c)程序在dev_driver_string或max8698_pmic_probe异常。选择配置文件smdkv210_android_defconfig(arch/arm/configs)修改网卡寄存器配置(移植mach-x210.c)led亮且未显示解压zImage信息则解压部分异常(实际为物理地址错误)

2023-12-14 01:07:17 387

原创 kernel(二):启动内核

kernel建立页表:kernel先建立段式页表(同uboot建立页相同页,大小为1MB,1MB映射4GB需4096页表项,每个页表项4字节,共需16KB做页表),建立细页表(细页表项大小为4kb)uboot启动内核(theKernel(0,machid,bd->bi_boot_params))运行时把0写入r0,machid写入r1,bd->bi_boot_params写入r2。其他备用init进程:/sbin/init,/etc/init,sbin/init,/bin/sh。

2023-12-12 20:31:51 897

原创 Kernel(一):基础

网卡DM9000:Kconfig(.config中CONFIG_ARM=y ==> depends on ARM || BLACKFIN || MIPS)==>menuconfig(DM9000 support:Y、N、M)==>.config(CONFIG_DM9000=y)==>(obj-$(CONFIG_DM9000) += dm9000.o)menuconfig和Kconfig:Kconfig为menuconfig菜单内容,修改Kconfig可修改(增删改)menuconfig菜单内容。

2023-12-10 16:07:39 791

原创 U-boot(八):官方uboot移植

(crt0.S设置栈,调用board_init_f函数进行板级初始化(arch/arm/lib/board.c)make s5p_goni_config调用mkconfig脚本传参(-A,s5p_goni)cpu_init_crit函数成功初始化串口、时钟后进入_main(arch/arm/lib/crt0.S)默认使用board_eth_init,cpu_eth_init两函数初始化网卡,故套壳函数初始化网卡。二阶段start_armboot:board_init_f和board_init_r。

2023-12-07 01:54:38 782

原创 U-boot(七):U-boot移植

网卡芯片CS引脚(片选信号),210每个SROM bank对应选信号CSn(n=0-5),210的DM9000接在CSn1(SROM bank1),DM9000总线地址基地址是0x88000000。210的SROM控制器是8/16bit接口,实际使用16位接口,网线有8根,4根都是GND,发送2根(Tx-,Tx+),接收2根(Rx+,Rx-)DM9000的CMD引脚接210的ADDR2引脚,数据线和地址线复用,CMD为高电平传输DATA,低电平传输INDEX(偏移地址)

2023-11-30 03:02:16 940

原创 U-boot(六):命令体系,环境变量,iNand/SD卡驱动

default_environment初始化环境变量(默认),二阶段SD卡的env分区crc校验通过,env_relocate读取SD卡环境变量覆盖default_environment,后面使用的都为SD卡环境变量。uboot二阶段初始化完成进入main_loop循环,main_loop执行一次为一条命令的获取,解析,执行(run_command)的过程。uboot每个命令对应cmd_tbl_t结构体的一个实例,输入命令结构体实例中查找对应的结构体,找到后调用命令函数执行命令。

2023-11-28 21:32:19 1029

原创 U-boot(五):启动内核

LINUX_ZIMAGE_MAGIC是魔数(0x016f2818)来表示zImage,即zImage格式镜像在头部存放该数作为标记辨别它是否是zImage(是否等于LINUX_ZIMAGE_MAGIC),若为在Image则对头部信息改造,用头信息初始化images,完成了校验。运行镜像过程:读取头信息MAGIC_NUM来确定镜像种类,镜像校验,读取头信息获取镜像信息(镜像长度,种类,入口地址),去entrypoint处运行镜像。

2023-11-26 15:25:28 929

原创 U-boot(四):start_armboot

dm9000_pre_init函数为网卡初始化(GPIO和端口配置非驱动),gd->bd->bi_arch_number定义机器码,gd->bd->bi_boot_params为内核启动传递参数内存地址(0x30000100)dram_init在一阶段初始化low_level_init中初始化,此处为给全局变量定义赋值,记录DDR配置(gd->bd->bi_dram)gd_t中定义全局变量,其中bd_t结构体包含硬件参数(波特率,IP,mac,机器码,启动参数,环境变量,DDR,网卡)

2023-11-23 20:52:58 1355

原创 U-boot(三):start.S

转换表是虚拟地址映射的关键包含表索引和表项,表索引对应虚拟地址,表项对应物理地址,表索引和表项构成转换表单元,可对内存块进行虚拟地址转换,转换表由转换表单元构成,每个单元对应1个内存块,整体对应整个内存空间(0-4G)的映射。构建异常向量表,启动介质选择,设置CPU为SVC模式,关看门狗,开发板供电置锁,时钟初始化,DDR初始化,串口初始化并打印"OK",重定位,建立映射表并开启MMU,清理bss,跳转到第二阶段。start.S uboot 一阶段

2023-11-20 22:27:05 109

原创 U-boot(二):主Makefile

CROSS_COMPILE:工具链(可外部定义:路径(/usr/local/arm/arm-2009q3/bin/)+工具链标签(arm-none-linux-gnueabi-))uboot链接地址用-Ttext指定(make x210_sd_config ==> uboot/board/samsung/x210/config.mk(定义TEXT_BASE))默认追加#include (开发板配置宏)到include/config.h(134-141)

2023-11-18 17:09:37 166

原创 U-boot(一):uboot基础

uboot对Flash和DDR管理:uboot在Flash起始地址(扇区0/1,SoC决定,大小512KB/1MB),环境变量大小32KB左右,kernel大小3MB/5MB,rootfs大小2/3G,其余为自由分区,各分区紧挨排布,不堆叠。启动过程:上电后先执行uboot、uboot初始化DDR和Flash,将OS从Flash中读到DDR中启动OS,uboot结束。部署:uboot(180~400K的裸机程序)在Flash(可上电读取)、OS在FLash(nand) uboot源码树目录 uboot编译

2023-11-14 20:00:38 226

原创 裸机程序指令集

210在启动过程:上电读取BL0程序,BL0实现观看门狗,初始化时钟,初始化堆和栈,判断启动方式(SD卡或Uart或USB启动)等并且读取代码BL1(16KB)到iSRAM,运行BL1代码来初始化NandFlash,再读取BL2到IRAM运行代码初始化DRAM,将OS读到DRAM,启动OS。项目程序启动:上电读取BL1,BL1(16KB)打开软开关,管看门狗,打开icache,设置SVC栈,初始化SDRAM,读取BL2到SDRAM,BL2实现linux界面和指令集。打印环境变量:env print。

2023-11-09 01:26:39 55

原创 S5PV210裸机(十):LCD

一行像素数据显示(LCD兼容):LCD控制器发送HSYNC高电平脉冲(宽度为HSPW),HBPD+有效行信息+HFPD(三部分)或HSPW+HBPD+有效行信息+HFPD(四部分)lcd接口为TTL接口(+5V为1,0V为0),不能传输太远,远距离传输方式:SoC(TTL) ->VGA-> LCD(TTL)像素深度(bpp):计算机用二进制位来表示像素的数据,位越多像素颜色值越多(1、8、16、24、32位)LCD显示单位为帧(一画面),一帧为多行,一行为多像素(像素矩阵)

2023-11-04 23:58:09 195

原创 S5PV210裸机(九):ADC

精度:若10二进制位来表示精度(210为10位或12位),量程为0~3.3V,则精度为3.3V/2^10=0.0032265V。通道数:模拟信号输入的路数,210共10ADC通道(AIN[0]~AIN[9]),同时可做10路AD转换,通道引脚为模拟引脚。转换速率(MSPS):每秒转多少M数字值,210为 1 MSPS。量程:模拟电压信号范围(210为0~3.3V)TSDATX0,TSDATY0转出的AD值。CLRINTADC0清中断。ADC:模数转换(模拟信号转数字信号)TSADCCON0 ADC的配置。

2023-10-30 19:36:03 81

原创 S5PV210裸机(八):I2C

I2CCON + I2CSTAT:产生通信时序,I2C接口配置 ,时钟一级分频I2CCON的bit6(等于PCLK/16或者PCLK/512)二级分频系数为[1,16]:65000KHz/512/4=31KHz。默认为0x55,当把CTRL_3的bit4为1,读取0xAA,第二次读自动变为0x55,用于测试通信是否成功。主设备在一通信周期广播发送8位从设备地址(7位从地址,1位表示读写,0主写1主接收)到总线,对应从设备响应。两相邻通信周期间是空闲态(其余忙态),通信周期由起始位开始,结,中间为通信数据。

2023-10-29 15:13:23 93

原创 S5PV210裸机(七):Nand和iNand

SD卡处于某种状态(空闲状态、准备好状态、读写状态、出错状态····),接受某种执行命令(跳转命令)并返回响应,跳转到另一状态。SD卡命令是周期性组合(组合命令),在命令周期中,发送CMD到SD卡,SD卡执行命令并且返回响应,主机接收响应后再发下一条。K9F2G08:K9F为发行商,2G为Nand大小是2Gbit(256MB),08为Nand是8位(8数据线即接口为8位:传输数据,地址,命令)nand接收和写入数据需要延时,通过状态寄存器判断是否写完,写完后再发送写入结束命令,再做ECC校验写入是否正常。

2023-10-26 19:38:37 115

原创 S5PV210裸机(六):SD卡

210上电执行iROM(BL0),BL0通过OMpin选择启动模式,初始化外部SD卡/NandFlash,读取SD卡前16KB(BL1)到SRAM中执行,初始化DRAM,再将加载到DRAM中去执行。uboot:uboot.bin大于16KB(前16KB为BL1,其余为BL2),先截取uboot.bin前16KB烧录到SD卡的block1--bolck32,再将其余烧录到SD卡。SD卡、MMC卡、MicroSD、TF卡:统一外部封装和接口,SD兼容MMC标准。SD卡有9个针脚:2接地口,1电源口,6信号口。

2023-10-24 00:24:32 207

原创 S5PV210裸机(五):定时器

PWM定时器时钟源为PCLK_PSYS,timer0、1共用prescaler0预分频器(8位),timer2、3、4使用prescaler1预分频器(8位),且每个timer有分频器预分频器和分频器构成分频系统,将PCLK_PSYS分频后的时钟给timer作为时钟周期。TCNT(不可读写)用于周期递减(-1)将计数值写入TCNTB中,启动timer前需要将TCNTB中的值刷到TCNT中(手写寄存器输入一次)预分频器分频值范围为1~256,分频器是MUX开关(1/1,1/2,1/4,1/8,1/16)

2023-10-22 17:15:38 190

原创 S5PV210裸机(四):按键中断

VICnADDRESS 存放已经产生的中断需要产生的函数地址,发生中断,读取对应VECnTADDR的中断处理程序到VICnADDRESS,cpu到VICADDRESS执行中断处理程序。注意:210有4个中断寄存器,每位对应一个中断源,中断发生irq_handler查询置1位(VICnIRQSTATUS寄存器位),判断中断编号和寄存器(VICn)EXT_INT_n_PEND是外部中断挂起,中断触发设置1,若为处理则一直为1直至处理。外部中断关键寄存器:EXT_CON、EXT_PEND、EXT_MASK。

2023-10-08 17:27:13 114

原创 S5PV210裸机(三):串口

Tx和Rx的GPIO,Rx为GPA0_1,Rx为GPA0_0,GPA0CON(0xE0200000)bit[3:0] = 0b0010 bit[7:4] = 0b0010。接收器由接收缓冲区和接收移位器构成,接收信息时,Rx通信线上的信息通过接收移位器将该二进制信息流保存到接收缓冲区,缓冲区满时产生中断给CPU,CPU读取数据。接收方定时读取通信线上电平高低来区分1,0依次读取数据位、奇偶校验位、停止位,停止位。串口通信发送方隔一段时间(波特率)将信息(1,0)放到通信线上,逐二进制位发送。

2023-10-05 11:41:49 144

原创 S5PV210裸机(二):看门狗,栈,icache,SoC时钟,重加载,led

xPLL_CON/xPLL_CON0/xPLL_CON1:打开/关闭PLL电路,设置PLL倍频参数,查看PLL锁定状态。CLK_DIV_STATn和CLK_MUX_STATn:查看DIV和MUX状态(完成或进行)210获得时钟:外部晶振+内部时钟发生器+内部PLL产生高频时钟(1GHz、1.2GHz)+内部分频器分频。CLK_SRC设置MUX开关,设置全0(bit0和bit4为0),APLL和MPLL禁用。mrc p15,0,r0,c1,c0,0 // 读出cp15的c1到r0中。

2023-10-02 17:26:56 131

原创 S5PV210裸机(一):裸机基础,arm指令,210启动刷机

c文件-->预编译-->.i文件-->编译-->.s文件-->汇编-->.o二进制文件(多个)-->链接-->elf可执行程序-->objcopy工具-->bin文件(可烧录到flash)-->总线-->cpu读入烧录的bin文件解码-->指令流水线-->cpu执行指令。.ascii .byte .short .long .word .quad .float .string 定义数据。

2023-10-02 10:14:27 130

原创 C理解(五):编译,链接库,宏,关键字,变量

内容:加载头文件(#include),清除注释(//,./*),替换条件编译(#if #elif #endif #ifdef),替换宏定义(#define)静态局部变量,分配在数据段/bss段(初始化非0在数据段,初始化0或未初始化在bss段),作用域为代码块作用域,生命周期为永久,链接属性为无连接,静态局部变量全局变量。文件.c->(预处理)->文件.i->(编译)->文件.S->(汇编)->文件.o->(链接)->elf程序。最值:#define MAX(a,b) (((a)>(b))?

2023-09-29 20:01:19 917

原创 C理解(四):链表

内核链表中纯链表封装,纯链表的各种操作函数(节点创建、插入、删除、遍历······),纯链表内嵌在驱动结构体中,实现驱动的创建、插入、删除、遍历等。

2023-09-29 19:18:21 196

空空如也

空空如也

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

TA关注的人

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