ARM-Linux驱动内核(S3C2440)

这篇具有很好参考价值的文章主要介绍了ARM-Linux驱动内核(S3C2440)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux启动流程

驱动(程序) : 驱使设备行动的程序

1. 启动bootloader---引导操作系统启动的(裸机)程序,为操作系统启动准备环境,并引导操作系统启动

2. 启动kernel---操作系统核心 (俗称的操作系统)

3. 加载根文件系统---一堆文件的集合(根目录下的文件)

ARM-Linux驱动内核(S3C2440),linux,arm开发,运维
ARM-Linux驱动内核(S3C2440),linux,arm开发,运维
 
存储分类
RAM(随机存储)
SRAM
静态

DRAM

动态

SDRAM

同步动态

SDR(DDR2\3\4\5)
ROM(只读存储)
PROM
可编程

EPROM

可擦除

EEPROM

电子可擦除文章来源地址https://www.toymoban.com/news/detail-817487.html

Flash : 是RAM和ROM的结合体。具有速度快,掉电不丢失的特点
Norflash : 可线性访问 (和内存访问方式相同)
Nandflash :不可线性访问 (需要专门的软件访问)
地址相关代码:运行地址(加载地址)和链接地址必须保持一致
地址无关代码:运行地址(加载地址)和链接地址可以不同
长跳转(绝对跳转): 目标函数的跳转地址是固定的(绝对位置)
短跳转(相对跳转): 目标函数的跳转地址是可变的(相对位置)
Bootloader :一个裸机程序
Kernel :一个复杂的程序
根文件系统:一堆文件的集合
uboot ------ booloader
初始 CPU( 工作模式 )
初始化异常向量表
初始化栈
初始化时钟
初始化内存
关看门狗
关闭 Cache
初始相关外设
集成相关的协议
搬移 kernel 到内存
向内核传参 ( 根文件系统类型 /
/init 进程 / 内核启动阶段使用
ip/ 调试串口 )
引导 kernel 启动 ( 设置 PC )
(bootloader 从此不再控制 cpu
cpu 的控制权彻底移交 kernel)
内存管理
文件管理
进程管理
网络管理
设备管理
启动到最后阶段时加载 ( 挂载的
形式 ) 根文件系统
先启动 init 进程 - > shell -> app
配置文件
系统命令 ( 程序 )
库文件 ( / 静态库 )
用户程序
普通文件 ( 文本 /mp3/ 图片 )
Tftp:简单文件传输协议 将uImage拷贝到tftp服务目录下
Nfs:网络文件系统 将rootfs.tar.gz拷贝到nfs服务目录下,并加sudo解压
  程序编译的过程:
                        预处理         编译           汇编             链接
                        main.c         main.i         main.s         main.o         mainapp
                        fun.c                                                  fun.o
                         gcc main.c fun.o -o mainapp
库:xxx.o的集合---归并
静态库 :会被编译进可执行程序 , 程序执行时不需要库文件
动态库 :不会被编译进可执行程序 , 程序执行时需要库文件 (编译和运行都需要库文件的存在)
动态库生成: gcc -fPIC -shared fun.c -o libfun.so
静态库生成: gcc -c fun.c -o fun.o
                       ar -rcv libfun.a fun.o  
Uboot启动:
Norflash:NORFLASH被接在0地址处,系统上电后PC默认指向0地址,直接运行norflash中的uboot
Nandflash: 系统上电后自动搬移 uboot 的前 4KB 的程序到 IRAM (IRAM 的起始地址 0x40000000 ,大小 4KB) ,此时 PC(0 地址 ) 被映射到0x40000000 地址处, uboot 必须在前 4KB 程序中完成内存的初始化,并将自己剩余的部分搬移到内存继续执行。
Kernel:
Nandflash : uboot 直接搬移 nandflash 中的 uImage 到内存的 0x30008000 地址处,启动内核
远程主机(ubuntu): uboot通过tftp将ubuntu中的uImage下载到内存的0x30008000地址处,启动内核
Rootfs:
Nandflash : 内核启动到最后阶段时直接挂载到 nandflash
远程主机(ubuntu): 通过nfs挂载到ubuntu中的nfs目录下

内核编译:

        选择模块进行编译------条件编译
        Kconfig 定义 make menuconfig 中的配置选项
        make menuconfig 可视化界面配置.config中的宏(内核活地图)
        .config 保存内核的配置(保存的是选择条件的值)
        Makefile:根据 .config 文件中的宏的值进行编译
        同层目录下 Kconfig 和 makefile 总是成对出现
动态加载驱动模块:
编译内核模块:
1. 配置 make menuconfig 模块编译选项为M (Kconfig 中类型定义为 tristate)
2. make uImage (如果原来该模块为 y,则需要重新编译出不包含该模块的内核)------非必要
3. make modules 编译内核模块 在源文件同层目录下生成同名的内核模块 xxx.ko
4. 将编译生成的 xxx.ko 拷贝到目标平台
动态加载:
1. insmod led.ko 动态加载内核模块(类似于windows下安装一个新的驱动)
2. lsmod 查看动态加载的驱动模块
3. rmmod led 卸载动态加载的驱动模块
ADC模块驱动编译
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/kdev_t.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/cdev.h>
#include <asm/string.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <linux/miscdevice.h>
#include <linux/interrupt.h>
#include <linux/irqreturn.h>
#include <linux/wait.h>
#include <linux/sched.h>

#define MAJOR_NUM  251
#define MINOR_NUM  0
#define DEV_NAME "adc"
#define ADCCON 0x58000000
#define ADCDAT0 0x5800000C
#define CLKCON 0x4C00000C
static volatile unsigned long * adccon;
static volatile unsigned long * adcdat0;
static volatile unsigned long * clkcon;
static wait_queue_head_t wq;
static unsigned int condition = 0;

static irqreturn_t irq_handler(int num, void * arg)
{
	printk("irq_handler num = %d\n", num);
	condition = 1;
	wake_up_interruptible(&wq);
	return IRQ_HANDLED;
}

static int init_adc(void)
{
	*adccon = (1 << 14) | (49 << 6);
	return 0;
}

static int adc_start(void)
{
	*adccon |= (1 << 0);
	return 0;
}

static unsigned short adc_read(void)
{
	unsigned short adc_value = *adcdat0 & 0x3ff;
	return adc_value; 
}

static int open(struct inode * node, struct file * file)
{
	init_adc();
	printk("adc open ...\n");
	return 0;
}

static ssize_t read(struct file * file, char __user * buf, size_t len, loff_t * loff)
{
	unsigned short data = 0;		
	printk("adc read start ...\n");
	condition = 0;
	adc_start();
	wait_event_interruptible(wq, condition);
	
	data = adc_read();
	copy_to_user(buf, &data, sizeof(data));

	printk("adc read end ...\n");
	return sizeof(data);
}

static ssize_t write(struct file * file, const char __user * buf, size_t len, loff_t * loff)
{
	return 0;
}

static int close(struct inode * node, struct file * file)
{
	printk("adc close ...\n");
	return 0;
}

static struct file_operations fops = 
{
	.owner = THIS_MODULE,
	.open = open,
	.read = read,
	.write = write,
	.release = close
};

static struct miscdevice misc_dev = 
{
	.minor = MISC_DYNAMIC_MINOR,
	.name = DEV_NAME,
	.fops = &fops
};

static int __init adc_init(void)
{
	int ret = 0;
	ret = misc_register(&misc_dev);
	if(ret < 0)
		goto err;

	ret = request_irq(IRQ_ADC, irq_handler, IRQF_DISABLED, "irq_adc", NULL);
	if(ret < 0)
		goto err_irq;

	init_waitqueue_head(&wq);

	adccon = ioremap(ADCCON, sizeof(adccon));
	adcdat0 = ioremap(ADCDAT0, sizeof(adcdat0));
	clkcon = ioremap(CLKCON, sizeof(clkcon));
	*clkcon |= (1 << 15);
	printk("CLKCON = %lx\n", *clkcon);

	printk("adc_init   ###############################\n");
	return 0;

err:
	misc_deregister(&misc_dev);
	printk("adc cdev_add failed ret = %d\n", ret);
	return ret;

err_irq:
	disable_irq(IRQ_ADC);
	free_irq(IRQ_ADC, NULL);
	misc_deregister(&misc_dev);
	printk("adc cdev_add failed ret = %d\n", ret);
	return ret;
}

static void __exit adc_exit(void)
{
	iounmap(clkcon);
	iounmap(adcdat0);
	iounmap(adccon);
	disable_irq(IRQ_ADC);
	free_irq(IRQ_ADC, NULL);
	misc_deregister(&misc_dev);
	printk("adc_exit   ###############################\n");
}

module_init(adc_init);
module_exit(adc_exit);
MODULE_LICENSE("GPL");

到了这里,关于ARM-Linux驱动内核(S3C2440)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM920T实验箱s3c2410 矩阵按键控制步进电机正反转和停止

    问题描述 按下第一个按键使步进电机可以正转、第二个反转反转、第三个按键停止 矩阵按键控制 画了张矩阵按键的内部电路图: 矩阵按键实物图: ABC 按键右边的就是步进电机。 按键第一行连接的是寄存器 GPFDAT0 的端口 第二行连接的是寄存器 GPFDAT2 的端口 第三行连接的是

    2024年02月09日
    浏览(45)
  • ARM-Linux开发与MCU开发的不同之处分析

    目录 一、ARM-Linux应用开发和单片机开发的不同 二、Arm-Linux基本开发环境 针对ARM-Linux程序的开发,主要分为三类:应用程序开发、驱动程序开发、系统内核开发。针对不同种类的软件开发,有其不同的特点。 今天,我们来看看ARM-Linux开发和MCU开发的不同点,以及ARM-Linux的基本

    2024年02月10日
    浏览(49)
  • ARM-Linux 开发板下安装编译 OpenCV 和 Dlib

    安装 OpenCV 和 Dlib 不像在 x86 平台下那样简单,用一句命令就可以自动安装完。而在 ARM 平台中许多软件都需要自行下载编译,且还有许多问题,本篇文章就是记录在 ARM 平台下载 OpenCV 踩过的坑。 硬件环境: RK3568 + Ubuntu20.04。 1、安装 OpenCV 需要的依赖库。 先添加源,以防安装

    2024年04月08日
    浏览(131)
  • 【交叉编译环境】安装arm-linux交叉编译环境到虚拟机教程(简洁版本)

    就是看到了好些教程有些繁琐,我就写了一个 我这个解压安装的交叉编译环境是Linaro GCC的一个版本,可以用于在x86_64的主机上编译arm-linux-gnueabihf的目标代码 步骤来了 在你的Ubuntu系统中 创建一个目录 ,例如/usr/local/arm,然后将下载好的gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueab

    2024年02月03日
    浏览(43)
  • arm-linux实现onvif server+WS-UsernameToken令牌验证

    目录 一、环境搭建 1、安装openssl 2、安装bison 3、安装flex 二、gsoap下载 三、编译x86版本gsoap 四、编译arm-linux版本gsoap 1、交叉编译openssl 1.1、下载openssl 1.2、交叉编译 2、交叉编译zlib 2.1、下载zlib 2.2、交叉编译 3、交叉编译gsoap 3.1、编译过程中遇到的问题 五、ONVIF框架生成 5.1、

    2024年04月14日
    浏览(31)
  • Linux(Kali\Ubuntu\CentOS\arm-Linux)安装Powershell

    下载链接:https://github.com/PowerShell/PowerShell/ 下载链接:https://github.com/PowerShell/PowerShell/releases 在 Ubuntu 上安装 PowerShell - PowerShell | Microsoft Docs PowerShell下载/PowerShell: PowerShell for every system! (github.com)

    2024年02月04日
    浏览(50)
  • 【全志T113-S3_100ask】15-1 内核5.4驱动spi屏幕——ILI9341

    本来想直接驱动mipi屏幕的,但是发现有一点点难度,所以想先研究一下小屏幕如何驱动。 本文章使用的芯片为全志T113-s3,目前使用的核心板是100ask的,但是官方开发板上面的spi接口不齐全,所以自制了一块板子进一步学习。 在原本的设备树中,配置是错误的,引脚都对不上

    2024年02月03日
    浏览(192)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第七天-内核函数接口(物联技术666)

    链接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd=1688 提取码:1688 //************************************************** #include linux/module.h    /*module_init()*/ #include linux/kernel.h        /* printk() */ #include linux/init.h            /* __init __exit */ #include linux/fs.h              /* file_opera

    2024年02月22日
    浏览(69)
  • 【ARM】内核驱动之中断

    ❤️作者主页:凉开水白菜 ❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步! ❤️专栏资料:https://gitee.com/stylle/linux_code ❤️ 点赞 👍 收藏 ⭐再看,养成习惯 订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑!

    2024年02月10日
    浏览(31)
  • ARM-SC2440

    2.1.1【MOV】 2.1.2【SUB】 2.1.3【ORR】 2.1.4【BIC】 2.1.5【cmp】 2.1.6【b】 2.1.6.2【bl】

    2024年04月14日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包