Linux内核驱动

Linux启动流程
固化代码启动,根据指定引脚的电平,确认从emmc或SD卡启动
拷贝uboot到内存中
uboot初始化始终、内存、网络等
根据cmdline,加载启动kernel,加载驱动模块
加载rootfs到内存
启动应用

uboot
命令:printenv、setenv、saveenv
参数:bootargs、cmdline、ip等,可直接修改代码
启动:tftpboot 0xXXXXX uImage直接下载到内存;fastboot flash XXX 下载到emmc,再从emmc加载到内存

kernel
.config文件
make menuconfig图形化配置(修改.config的CONFIG-XXX)
内核添加菜单选项Kconfig、Makefile
uImage = zImage + dtb
编译:make uImage

设备树
arch/arm/boot/dts
查看treedevices/bingding下的说明实例
#include文件
子节点:标签:name@地址
引用:追加属性
常用属性:compatible、address、reg、status
属性值:string、
查找属性:of_find_node_by_XXX
获取属性:of_operation_read_string
pintrl子系统:引脚、电气属性
编译:make dtb

驱动
模块加载:module_init
模块卸载:module_exit
__init、__exit:放到代码段
命令:insmod、rmmode、modprobe(自动添加依赖)
模块传参:module_param
模块导出方法:EXPORT_SYMBOL

字符设备
注册:
自动申请设备号:alloc_chrdev_region
手动:MKDEV、register_region
初始化:cdev_init
添加到内核:cdev_add
申请设备节点:class_create、device_create
释放:
device_destroy
class_destroy
cdev_del
unregister_chrdev_region
实现file_operation:owner、open/release、read/write
查看:cat /proc/devices、cat /dev/XXX

设备总线
设备和驱动分离,设备和驱动挂载到总线,通过匹配拿到信息
platform_get_resource

device:
platform_device
注册platform_device_register
bus_add_driver
driver_attach
匹配platcform_match:先和设备树匹配,不行再和id_table
绑定driver_probe_device

driver:
platform_driver
注册platform_driver_register
platform_device_add
device_add
device_attach
匹配platcform_match:先和设备树匹配,不行再和id_table
绑定driver_probe_device

gpio:gpio_request、gpio_free
中断:request_irq、free_irq
中断处理下半部:处理耗时操作,使用tasklet或workqueue,在上半部中调用task_schedule或schedule_work
定时器
竞争:互斥锁mutex、自旋锁spin、原子操作atomic

总线
UART:同步串行,1帧1字节
I2C:同步半双工,从器件地址,寄存器地址、方向,i2cdetect、i2cget、i2cget,一个总线一个adapter
SPI:同步全双工
CAN:CANID 仲裁

实战
1.修改设备树
pintrl配置时钟/数据/使能/片选/中断线
配置寄存器、中断号、PWM、时钟、屏参等
2.内核开启外设驱动、开启总线

EMMC:SDIO(8条数据线);总线:i2C;内核:SDMMC Controller
LCD:设备树:bitwidth(RGB565、RGB888)、背光(开启PWM、时钟)、修改水平像素/垂直像素等屏参;内核:LCDC(输出RGB信号)
HDMI:芯片sii9022将RGB信号转成HDMI信号;总线:i2c
触摸:中断/复位引脚;总线:i2c;内核:GT911、input子系统
音频:总线:i2c/sai;内核:cs42l51
蓝牙:总线:UART;内核:AP6236
WIFI:总线:SDIO;
CAN:内核开启CAN总线,socket

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
买书时赠送的电子稿,代码示例丰富,非常不错!全书分三个文件打包。 linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |--

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值