Exynos4412 内核移植(五)—— 驱动的移植

以移植自己制作的驱动,学习内核移植中的驱动移植,及 驱动程序的动态编译和静态编译


硬件环境:

Linux 内核版本:Linux 3.14

主机:Ubuntu 12.04发行版

目标机:FS4412平台

交叉编译工具:arm-none-linux-gnueabi-gcc


一、静态编译

1、添加驱动文件

       将写好的实验代码fs4412_led_drv.c 拷贝到 drivers/char 下

fs4412_led_drv.c 如下:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #include <linux/kernel.h>  
  2. #include <linux/module.h>  
  3. #include <linux/fs.h>  
  4. #include <linux/cdev.h>  
  5.   
  6. #include <asm/io.h>  
  7. #include <asm/uaccess.h>  
  8.   
  9. MODULE_LICENSE("Dual BSD/GPL");  
  10.   
  11. #define LED_MAGIC 'L'  
  12. /* 
  13.  * need arg = 1/2  
  14.  */  
  15.   
  16. #define LED_ON  _IOW(LED_MAGIC, 0, int)  
  17. #define LED_OFF _IOW(LED_MAGIC, 1, int)  
  18.   
  19.   
  20. #define LED_MA 500  
  21. #define LED_MI 0  
  22. #define LED_NUM 1  
  23.   
  24. #define FS4412_GPX2CON  0x11000C40  
  25. #define FS4412_GPX2DAT  0x11000C44  
  26.   
  27. static unsigned int *gpx2con;  
  28. static unsigned int *gpx2dat;  
  29.   
  30. struct cdev cdev;  
  31.   
  32. static int s5pv210_led_open(struct inode *inode, struct file *file)  
  33. {  
  34.     return 0;  
  35. }  
  36.       
  37. static int s5pv210_led_release(struct inode *inode, struct file *file)  
  38. {  
  39.     return 0;  
  40. }  
  41.       
  42. static long s5pv210_led_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  
  43. {  
  44.     int nr;  
  45.   
  46.     switch (cmd) {  
  47.         case LED_ON:  
  48.             writel(readl(gpx2dat) | 1 << 7, gpx2dat);  
  49.             break;  
  50.         case LED_OFF:  
  51.             writel(readl(gpx2dat) & ~(1 << 7), gpx2dat);  
  52.             break;  
  53.     }  
  54.   
  55.     return 0;  
  56. }  
  57.       
  58. struct file_operations s5pv210_led_fops = {  
  59.     .owner = THIS_MODULE,  
  60.     .open = s5pv210_led_open,  
  61.     .release = s5pv210_led_release,  
  62.     .unlocked_ioctl = s5pv210_led_unlocked_ioctl,  
  63. };  
  64.   
  65. static int s5pv210_led_init(void)  
  66. {  
  67.     dev_t devno = MKDEV(LED_MA, LED_MI);   
  68.     int ret;  
  69.   
  70.     ret = register_chrdev_region(devno, LED_NUM, "newled");  
  71.     if (ret < 0) {  
  72.         printk("register_chrdev_region\n");  
  73.         return ret;  
  74.     }  
  75.   
  76.     cdev_init(&cdev, &s5pv210_led_fops);  
  77.     cdev.owner = THIS_MODULE;  
  78.     ret = cdev_add(&cdev, devno, LED_NUM);  
  79.     if (ret < 0) {  
  80.         printk("cdev_add\n");  
  81.         goto err1;  
  82.     }  
  83.   
  84.     gpx2con = ioremap(FS4412_GPX2CON, 4);  
  85.     if (gpx2con == NULL) {  
  86.         printk("ioremap gpx2con\n");  
  87.         ret = -ENOMEM;  
  88.         goto err2;  
  89.     }  
  90.   
  91.     gpx2dat = ioremap(FS4412_GPX2DAT, 4);  
  92.     if (gpx2dat == NULL) {  
  93.         printk("ioremap gpx2dat\n");  
  94.         ret = -ENOMEM;  
  95.         goto err3;  
  96.     }  
  97.   
  98.     writel((readl(gpx2con) & ~(0xf << 28)) | (0x1 << 28), gpx2con);  
  99.     writel(readl(gpx2dat) & ~(0x1<<7), gpx2dat);  
  100.   
  101.     printk("Led init\n");  
  102.   
  103.     return 0;  
  104. err3:  
  105.     iounmap(gpx2con);  
  106. err2:  
  107.     cdev_del(&cdev);  
  108. err1:  
  109.     unregister_chrdev_region(devno, LED_NUM);  
  110.     return ret;  
  111. }  
  112.   
  113. static void s5pv210_led_exit(void)  
  114. {  
  115.     dev_t devno = MKDEV(LED_MA, LED_MI);  
  116.   
  117.     iounmap(gpx2dat);  
  118.     iounmap(gpx2con);  
  119.     cdev_del(&cdev);  
  120.     unregister_chrdev_region(devno, LED_NUM);  
  121.     printk("Led exit\n");  
  122. }  
  123.   
  124. module_init(s5pv210_led_init);  
  125. module_exit(s5pv210_led_exit);  


2、修改drivers/char/Kconfig

       在menu "Character devices"下面添加如下内容:


可以看到 配置界面里已经有该配置选项

打开help看一下,和我们写的都一样


3、修改 drivers/char/Makefile 

      在文件最后添加如下代码



4、将 fs4412_led_app.c 拷贝到linux 下任意目录下并交叉编译测试程序


具体代码如下:

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. #include <stdio.h>  
  2. #include <fcntl.h>  
  3. #include <unistd.h>  
  4. #include <stdlib.h>  
  5. #include <sys/ioctl.h>  
  6.   
  7. #define LED_MAGIC 'L'  
  8.   
  9. #define LED_ON  _IOW(LED_MAGIC, 0, int)  
  10. #define LED_OFF _IOW(LED_MAGIC, 1, int)  
  11.   
  12. int main(int argc, char **argv)  
  13. {  
  14.     int fd;  
  15.   
  16.     fd = open("/dev/led", O_RDWR);  
  17.     if (fd < 0) {  
  18.         perror("open");  
  19.         exit(1);  
  20.     }  
  21.   
  22.     while(1)  
  23.     {  
  24.         ioctl(fd, LED_ON);  
  25.         usleep(100000);  
  26.         ioctl(fd, LED_OFF);  
  27.         usleep(100000);  
  28.     }  
  29.   
  30.     return 0;  
  31. }  


5、静态编译LED驱动

a -- 配置内核时按“空格”选择,配置完成后保存退出


注意:这里是 * 号,是Y,要编进内核的


b -- 保存退出,重新编译后把 uImage 拷贝到tftpboot 下

make uImage

cp arch/arm/boot/uImage /tftpboot


 重启开发板,加载内核并运行,在终端下执行下面操作

c -- 创建设备节点

mkdnod /dev/ledc 5000

注:设备号 cat/proc/devices 查看


d -- 运行测试程序并观察现象

./fs4412_led_test



二、动态编译

1、配置内核时按“空格”选择,配置完成后保存退出


注意:这里选择是M,编成模块。


2、保存退出,重新编译后把uImage 拷贝到tftpboot下,把驱动模块拷贝到 /nfsroot/rootfs 下

make uImage modules

cp arch/arm/boot/uImage /tftpboot

cp drivers/char/fs4412_led_drv.ko /nfsroot/rootfs


重新启动开发板,linux运行起来后在终端下操作

a -- 创建设备节点

mknod dev/ledc 5000


b -- 加载LED驱动模块

insmod fs4412_led_drv.ko


c -- 运行测试程序并观察现象

./fs4412_led_app

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FTP文件共传输服务

FTP文件共传输服务一&#xff0c;vsftpd服务基础&#xff08;1&#xff09;&#xff0c;FTP服务概述FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是典型的C/S结构的应用层协议&#xff0c;需要由服务端软件、客户端软件共同实现文件传达输功能…

Exynos4412 内核移植(四)—— MMU 相关知识解析

一、MMU的产生 许多年以前&#xff0c;当人们还在使用DOS或是更古老的操作系统的时候&#xff0c;计算机的内存还非常小&#xff0c;一般都是以K为单位进行计算&#xff0c;相应的&#xff0c;当时的程序规模也不大&#xff0c;所以内存容量虽然小&#xff0c;但还是可以容纳当…

Mysql limit 子查询

为什么80%的码农都做不了架构师&#xff1f;>>> &#xff08;1&#xff09;mysql limit 不支持子查询像下面这条语句无法执行 SELECT * FROM b_c_s1 where CT_ID IN (SELECT DISTINCT CT_ID FROM b_c_s1 LIMIT 0,2); &#xff08;2&#xff09;应该在只查询外面再…

Exynos4412 内核移植(二)—— 内核编译过程分析

内核的编译同样是从Makefile 来分析&#xff1a; 一、内核源码结构 Linux内核文件数目近2万&#xff0c;出去其他架构CPU的相关文件&#xff0c;他们分别位于顶层目录下的17个子目录&#xff0c;各个目录功能独立&#xff0c;下面是常用目录&#xff1a; arch:体系结构相关代码…

深入理解Java:注解(Annotation)

2019独角兽企业重金招聘Python工程师标准>>> 一、概述 1.什么是注解&#xff08;Annotation&#xff09; Annotation&#xff08;注解&#xff09;就是Java提供了一种元程序中的元素关联任何信息和着任何元数据&#xff08;metadata&#xff09;的途径和方法。Ann…

Exynos4412 内核移植(三)—— 内核启动过程分析

内核启动所用函数如下&#xff1a; 与移植U-Boot 的过程相似&#xff0c;在移植Linux 之前&#xff0c;先了解它的启动过程。Linux 的过程可以分为两部分&#xff1a;架构/开发板相关的引导过程、后续的通用启动过程。对于uImage、zImage ,它们首先进行自解压得到vmlinux &…

开源自己用python封装的一个Windows GUI(UI Automation)自动化工具,支持MFC,Windows Forms,WPF,Metro,Qt...

首先&#xff0c;大家可以看下这个链接 Windows GUI自动化测试技术的比较和展望 。 这篇文章介绍了Windows中GUI自动化的三种技术&#xff1a;Windows API, MSAA - Microsoft Active Accessibility, UIAutomation 用脚本语言AutoIT实现自动化就是第一种技术Windows API, 查找窗…

Exynos4412 Uboot 移植(六)—— 相关知识补充

Uboot版本&#xff1a;u-boot-2013.01 一、gd结构体的定义与使用 gd_t 和 bd_t 是u-boot中两个重要的数据结构&#xff0c;在初始化操作很多都要靠这两个数据结构来保存或传递。 gd_t 定义在/u-boot-2013.01/arch/arm/include/asm/global_data.h bd_t 定义在 ./include/asm-ar…

Exynos4412 Uboot 移植(五)—— Uboot 移植过程

Uboot 版本&#xff1a;u-boot-2013.01 开发板&#xff1a;FS_4412 平台&#xff08;Exynos4412,可以根据自己的板子修改&#xff0c;只要是4412的过程都是一样的&#xff09; 一、建立自己的平台 1、下载源码 我们可以在下面这个网站上下载最新的和以前任一版本的uboot ftp://…

Nagios 安装及常见错误

一、实验环境监控服务器&#xff08;nagios服务器--192.168.1.100&#xff09;CentOS5.4 nagios-3.2.1 nagios-plugins-1.4.14 nrpe-2.12被监控客户端&#xff08;linux客户端--192.168.1.200&#xff09;CentOS5.4 nagios-plugins-1.4.14 nrpe-2.12二、nrpe插件1、nrpe插…

Exynos4412 Uboot 移植(四)—— Uboot引导内核过程分析

bootloader 要想启动内核&#xff0c;可以直接跳到内核的第一个指令处&#xff0c;即内核的起始地址&#xff0c;这样便可以完成内核的启动工作了。但是要想启动内核还需要满足一些条件&#xff0c;如下所示&#xff1a; 1、cpu 寄存器设置 * R0 0 * R1 机器类型 id …

Exynos4412 Uboot 移植(三)—— Uboot添加自定义命令

Uboot添加自定义命令&#xff1a;uboot中的命令使用U_BOOT_CMD这个宏声明来注册进系统&#xff0c;链接脚本会把所有的cmd_tbl_t结构体放在相邻的地方。 UBoot版本&#xff1a;u-boot-2013.01 一、U-Boot命令的格式 即使是内核的启动&#xff0c;也是通过U-Boot命令来实现的。…

Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析

uboot启动流程分析如下&#xff1a; 第一阶段&#xff1a; a -- 设置cpu工作模式为SVC模式 b -- 关闭中断&#xff0c;mmu,cache v -- 关看门狗 d -- 初始化内存&#xff0c;串口 e -- 设置栈 f -- 代码自搬移 g -- 清bss h -- 跳c 第二阶段 a -- 初始化外设&#xff0c;进入超…

Linux内核学习四库全书

http://blog.csdn.net/21aspnet/article/details/6585602 关于内核学习我建议不要上来就读内核而是先了解内核的构成和特性&#xff0c;然后通过思考发现疑问这时再去读内核源码。即先了解概貌在读局部细节。而且内核分成好多部分&#xff0c;不要只是按照顺序去读&#xff0c;…

Exynos4412 Uboot 移植(一)—— Uboot 编译流程分析

Uboot 所用版本 u-boot-2013.01 u-boot-2013.01 中有上千文件&#xff0c;要想了解对于某款开发板&#xff0c;使用哪些文件、哪些文件首先执行、可执行文件占用内存的情况&#xff0c;最好的方法就是阅读它的Makefile。 根据顶层Readme文件的说明&#xff1a; 可以知道如果使…

Exynos4412 所用内存 —— DDR2

一、SDRAM 二、DDR 三、DDR2 四、DDR2的配置

Exynos4412启动过程分析

学习Exynos4412启动流程前&#xff0c;我们先看看三星4412芯片启动框图&#xff1a; 我们从图中可以看到4412内部有64K的ROM和256K SRAM&#xff0c;在ROM中已经固化好了一段代码&#xff0c;当硬件上电后首先运行的就是这段代码&#xff0c;这段代码三星起名为BLO&#xff08;…

Exynos4412 所用外存 —— eMMC

Exynos4412所用外存不是原来的Nand Flash 与 Nor Flash&#xff0c;而是eMMC。eMMC是什么呢&#xff1f;和Nand Flash有什么区别呢&#xff1f; 一、eMMC概述 eMMC&#xff08;Embeded MultiMedia Card&#xff09;&#xff1a;它并非是一种全新尺寸的存储卡&#xff0c;而…

mini-uboot 启动过程简单分析

单片机有最小系统&#xff0c;所谓最小系统&#xff0c;就是单片机能正常工作所需要的最少外设。对于Uboot来说&#xff0c;同样有个最小系统&#xff0c;因为Uboot最主要的功能就是引导内核。下面我们通过一个简单的Mini-Uboot来分析Uboot的启动加载过程。&#xff08;只是分析…

MySql中的varchar类型

2019独角兽企业重金招聘Python工程师标准>>> MySql中的varchar类型&#xff08;转&#xff09; 今天新开始的项目在做数据库设计&#xff0c;发现自己对MySql的varchar类型还不熟悉&#xff0c;故又上网收集资料整理如下。 1.varchar类型的变化 MySQL 数据库的va…