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-21 09:51

移植较新(Linux3.19)内核至mini2440开发板(一)
下面开始正题 注:内核启动时可能会出现乱码,可以在u-boot下设置如下环境变量:setenv bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 saveenv 1.1下载Linux3.19的源代码 从Linux kernel的官方网站可以下载最新的内核代码,我们选择linux-3.19.4.tar.gz这个文件下载。下载后解压至工作目录。进入内核目录,打开Makefile文件,修改如下两行: -ARCH ?= $(SUBARCH) -CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:
[单片机]
通过TX2440A移植文档总结出移植驱动方法
第一种情况:(内核已存在要移植的驱动) 假如要移植A驱动,而且源码中已存在该驱动源码,那么移植的一般方法如下: 1、在arch/arm/mach-s3c2440/mach-smdk2440.c的Platform_device结构体中加上A这项,如果存在就不用添加。 2、然后做相应的修改,如在arch/arm/plat-s3c24xx/devs.c添加相应的结构体、修改源码,有些不用做出相应的修改,如RTC就不用修改。 3、最后配置内核(make menuconfig)。 第二种情况:(内核不存在要移植的驱动) 假如要移植B驱动,而且源码中不存在该驱动源码,那么移植的通用方法如下: 将写好的B驱动源代码拷贝到相应的源代码目录,
[单片机]
linux2.6.18内核S3C2410平台移植笔记
我使用的实验箱是Embest EDUKIT-III,板上资源CPU:SAMSUNG S3C2410A、FLASH:K9F5608U0(Samsung NAND 32MiB),烧录工具:embest flash programmer。因为厂家自带的是2.4的内核,目前学习开发用的基本上都是2.6内核,这两者改动还是比较大的。电话咨询过技术支持后,对方说只想在板子上跑系统的话还是比较好移植的。于是决心自己动手移植内核。不然今后的驱动编写,都没有合适的运行环境,影响进度。所以工欲善其事,必先 利其器,前期的这些准备还是很有必要的。那几天刚好ubuntu10.10发布,满怀期待的我升完级后,结果悲剧了,中文显示变得发虚模糊,主题颜色也极度
[单片机]
基于TQ2440linux-2.6.30.4内核移植
移植环境 CPU:S3C2440 交叉编译器:arm-linux-gcc-4.3.3 虚拟机系统:Ubuntu12.04 参考资料:《天嵌科技linux移植手册》 移植步骤 1、获取内核源码 网址:http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/ 找到linux-2.6.30.4压缩包下载即可,然后拷贝到虚拟机中解压 2、在系统中添加对ARM的支持 进入内核源码根目录 Makefile中,修改 ARCH = arm CROSS_COMPILE = arm-linux- 3、修改平台输入时钟 修改内核源码 arch/arm/mach-s3c2440
[单片机]
基于TQ2440<font color='red'>的</font>linux-2.6.30.4<font color='red'>内核</font><font color='red'>移植</font>
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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