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

发布者:幸福之舞最新更新时间:2022-01-13 来源: eefocus关键字: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 如下:

#include

#include

#include

#include

 

#include

#include

 

MODULE_LICENSE("Dual BSD/GPL");

 

#define LED_MAGIC 'L'

/*

 * need arg = 1/2 

 */

 

#define LED_ON _IOW(LED_MAGIC, 0, int)

#define LED_OFF _IOW(LED_MAGIC, 1, int)

 

#define LED_MA 500

#define LED_MI 0

#define LED_NUM 1

 

#define FS4412_GPX2CON 0x11000C40

#define FS4412_GPX2DAT 0x11000C44

 

static unsigned int *gpx2con;

static unsigned int *gpx2dat;

 

struct cdev cdev;

 

static int s5pv210_led_open(struct inode *inode, struct file *file)

{

return 0;

}

static int s5pv210_led_release(struct inode *inode, struct file *file)

{

return 0;

}

static long s5pv210_led_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

{

int nr;

 

switch (cmd) {

case LED_ON:

writel(readl(gpx2dat) | 1 << 7, gpx2dat);

break;

case LED_OFF:

writel(readl(gpx2dat) & ~(1 << 7), gpx2dat);

break;

}

 

return 0;

}

struct file_operations s5pv210_led_fops = {

.owner = THIS_MODULE,

.open = s5pv210_led_open,

.release = s5pv210_led_release,

.unlocked_ioctl = s5pv210_led_unlocked_ioctl,

};

 

static int s5pv210_led_init(void)

{

dev_t devno = MKDEV(LED_MA, LED_MI); 

int ret;

 

ret = register_chrdev_region(devno, LED_NUM, "newled");

if (ret < 0) {

printk("register_chrdev_regionn");

return ret;

}

 

cdev_init(&cdev, &s5pv210_led_fops);

cdev.owner = THIS_MODULE;

ret = cdev_add(&cdev, devno, LED_NUM);

if (ret < 0) {

printk("cdev_addn");

goto err1;

}

 

gpx2con = ioremap(FS4412_GPX2CON, 4);

if (gpx2con == NULL) {

printk("ioremap gpx2conn");

ret = -ENOMEM;

goto err2;

}

 

gpx2dat = ioremap(FS4412_GPX2DAT, 4);

if (gpx2dat == NULL) {

printk("ioremap gpx2datn");

ret = -ENOMEM;

goto err3;

}

 

writel((readl(gpx2con) & ~(0xf << 28)) | (0x1 << 28), gpx2con);

writel(readl(gpx2dat) & ~(0x1<<7), gpx2dat);

 

printk("Led initn");

 

return 0;

err3:

iounmap(gpx2con);

err2:

cdev_del(&cdev);

err1:

unregister_chrdev_region(devno, LED_NUM);

return ret;

}

 

static void s5pv210_led_exit(void)

{

dev_t devno = MKDEV(LED_MA, LED_MI);

 

iounmap(gpx2dat);

iounmap(gpx2con);

cdev_del(&cdev);

unregister_chrdev_region(devno, LED_NUM);

printk("Led exitn");

}

 

module_init(s5pv210_led_init);

module_exit(s5pv210_led_exit);


2、修改drivers/char/Kconfig

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

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

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

3、修改 drivers/char/Makefile 

在文件最后添加如下代码

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

具体代码如下:


#include

#include

#include

#include

#include

 

#define LED_MAGIC 'L'

 

#define LED_ON _IOW(LED_MAGIC, 0, int)

#define LED_OFF _IOW(LED_MAGIC, 1, int)

 

int main(int argc, char **argv)

{

int fd;

 

fd = open("/dev/led", O_RDWR);

if (fd < 0) {

perror("open");

exit(1);

}

 

while(1)

{

ioctl(fd, LED_ON);

usleep(100000);

ioctl(fd, LED_OFF);

usleep(100000);

}

 

return 0;

}


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

关键字:Exynos4412  内核移植 引用地址:Exynos4412 内核移植(五)—— 驱动的移植

上一篇:Exynos4412 内核移植(六)—— 设备树解析
下一篇:Exynos4412 Uboot 移植(四)—— Uboot引导内核过程分析

推荐阅读最新更新时间:2024-11-10 10:43

Linux2.6内核2410平台上移植
一、准备必要的文件 1.首先去官方网站下载最新的llinux内核 http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2 2.因为linux2.6.14内核需要更新版本的编译器,所以需要下载交叉编译器 ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2 二、安装文件 1、把gcc解压到/usr/local/arm/3.4.1目录下 2、接下来需要解压linux内核,输入命令: # tar -jxvf linux-2.6.14.tar.bz2 将内核解压
[单片机]
Exynos4412 内核移植(二)—— 内核编译过程分析
内核的编译同样是从Makefile 来分析: 一、内核源码结构 Linux内核文件数目近2万,出去其他架构CPU的相关文件,他们分别位于顶层目录下的17个子目录,各个目录功能独立,下面是常用目录: arch:体系结构相关代码 ipc:进程调度相关代码 mm:内存管理 Documentation:帮助文档 net:网络协议 lib:库 scripts:编译相关脚本工具 tools:编译相关工具 drivers:设备驱动 fs:文件系统实现 对于ARM 架构的Exynos4412,其体系相关的代码在arch/arm/目录下,在后面进行的Linux移植时,开始的工作正式修改这个目录下的文件。 二、Linux Make
[单片机]
<font color='red'>Exynos4412</font> <font color='red'>内核</font><font color='red'>移植</font>(二)—— <font color='red'>内核</font>编译过程分析
Exynos4412裸机程序之DDR工作原理与时序(二)
上一篇文章 Tiny4412裸机程序之DDR工作原理与时序(一) 我们学习了DDR SDRAM的工作原理,这一节我们接着讲一下DDR2的一些知识,看看与DDR、SDRAM 有什么不同,这一节的内容也基本来自于网络。 DDR的发展沿着更高数据传输频率,更大内存容量的方向发展,DDR2中做到更高数据传输频率,由DDR的2-bit pretetch向4-bit pretetch发展,而扩展容量,除了增加每个L-Bank的容量以外,另外就是增加L-Bank数,也就是说在内存中,原来DDR中Bank线只有2根,一块内存芯片最多2^2=4片L-Bank,而在DDR2中变成了2^3=8片L-Bank。(下面的一些图和文档出自于芯片手册) 一、4
[单片机]
<font color='red'>Exynos4412</font>裸机程序之DDR工作原理与时序(二)
u-boot-2009.08在mini2440上移植 增加DM9000网卡驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 u-boot-2009.08版本已经对CS8900、RTL8019和DM9000X等网卡有比较完善的代码支持(代码在drivers/net/目录下),而且在S3C24XX系列中默认对CS8900网卡进行配置使用。而mini2440开发板使用的则是DM9000网卡芯片
[单片机]
#嵌入式Linux最小系统移植# mini2440内核4.0.8移植记录
/*移植内核Linux4.0.8*/ 1.机器码匹配(linux/arch/arm/tools/mach-types) # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number mini2440 MACH_MINI2440 MINI2440 1999 oluan2440 MACH_OLUAN2440 OLUAN2440 1999 MACH_TYPE_xxx 与MACHINE_START中匹配 CONFIG_xxxx 与linux/arch/arm/mach-s3c244
[单片机]
Linux移植内核启动过程start_kernel函数简析
在Linux移植之内核启动过程引导阶段分析中从arch/arm/kernel/head.S开始分析,最后分析到课start_kernel这个C函数,下面就简单分析下这个函数,因为涉及到Linux的内容较多,这里只是简单介绍下内核启动流程。先看一下内核启动的流程框图,截图来自《嵌入式Linux应用开发完全手册》。内核引导阶段已经分析过,接下来分析一下内核启动的第二阶段。 1、start_kernel函数全局概览 2、start_kernel函数调用层次 1、start_kernel函数全局概览,对start_kernel作一下粗略注释。 打开initMain.c ,下面主要分析处理UBOOT传入的参数,其中r1是传入的第一个参
[单片机]
Linux<font color='red'>移植</font>之<font color='red'>内核</font>启动过程start_kernel函数简析
Linux-2.6.32.2内核在mini2440上移植(四)---根文件系统制作(2)
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 http://linux.chinaunix.net/techdoc/system
[单片机]

推荐帖子

DSP优化
从在DSP上做智能视频以来,看到很多优化的文档,受益非浅,在这根据俺这短短的经验,也总结一二。优化分很多方面,或者说不同的层次,不同方面的考虑的问题和优化方式完全不同,俺稍微懂点的会慢慢展开,不懂的继续学习...1)系统2)算法3)编译4)循环5)计算(定点,位计算)6)线性汇编7)汇编优化是个无底洞,不过俺觉得有几个原则:1)只要满足了系统的要求,就没必要一直做下去。一旦数上了cycles,就容易上瘾,所以花费的精力也越来越多,但是效益往往降低。2)
svmtracking DSP 与 ARM 处理器
CAN 网络通讯检测
物理层检测哪里可以做呢?CAN网络通讯检测想做什么?要得到什么结果工具:示波器+某软件如:周立功的USB转CAN(淘宝几百)Kvaser的USBCAN(几千块)Vector的VN1600(几万)
jessica8780465 汽车电子
【机器人底盘说】 基于Athena2.0底盘的智能“馆长”,能导引,会乘梯
思岚科技的技术理念一直是软硬结合,以软件为牵引、硬件为驱动、系统为闭环,实现算法、算力和系统的全面技术突破。在科幻片《头号玩家》中,博物馆馆长凭借智能调动图书查阅相关历史和文化的能力,成功帮助韦德沃兹逐近彩蛋所在地。在现实生活中,智能图书馆馆长也并不少见。这款图书馆机器人可满足图书馆智能问答、引导、图书信息查询、查找、配送等多项功能,提高图书馆的服务效率和质量,为读者提供更加便捷、高效、个性化的服务的同时,也推动图书馆的数智化升级。
SLAMTEC思岚科技 传感器
MCU设备
田朗电子致力于---音响方案提供和收音头的生产.以收音系统(AM中波/FM调频/SW1短波1/SW2短波2)模块为基础,整合开发一体化汽车音响和家用音响方案,为终端制造厂商提供包括收音头、MCU设备,核心软件芯片、协议,音响参考设计方案(AM/FM收音、USBHOST/SD插卡MP3播放、iPod控制、蓝牙免提)和生产技术在内的整体解决方案。MCU设备
tunersys 单片机
请教高手
在单片机编程时用KEIL编译器老出现下面警告,请问下是什么意思:***WARNINGL1:UNRESOLVEDEXTERNALSYMBOL***WARNINGL2:REFERENCEMADETOUNRESOLVEDEXTERNAL请教高手
miaoxueming 单片机
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved