ZLG I.MX287A led内核驱动模块调试生成记录

自己编译内核驱动模块的记录:

led.c

/*
   GPIO Driver driver for EasyARM-iMX283
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/ioctl.h>
#include <linux/delay.h>
#include <linux/bcd.h>
#include <linux/capability.h>
#include <linux/rtc.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>

#include </usr/src/linux-2.6.35.3/arch/arm/mach-mx28/mx28_pins.h>
/*这里的路径要设置正确*/
#define DEVICE_NAME "imx28x_led"

#define LED_GPIO    MXS_PIN_TO_GPIO(PINID_LCD_D23)      //for 283 287A/B
//#define LED_GPIO  MXS_PIN_TO_GPIO(PINID_SAIF0_MCLK)   //for 280

/*--------------------------------------------------------------------------------------------------------
*/
static int gpio_open(struct inode *inode, struct file *filp);
static int  gpio_release(struct inode *inode, struct file *filp);
ssize_t gpio_write(struct file *filp, const char __user *buf, size_t count,
                loff_t *f_pos);
static int gpio_ioctl(struct inode *inode,struct file *flip,unsigned int command,unsigned long arg);
static int gpio_init(void);
static void gpio_exit(void);

/*--------------------------------------------------------------------------------------------------------
*/

static int gpio_open(struct inode *inode, struct file *filp)
{
    gpio_request(LED_GPIO, "led");

    return 0;
}

static int  gpio_release(struct inode *inode, struct file *filp)
{
    gpio_free(LED_GPIO);
    return 0;
}


ssize_t gpio_write(struct file *filp, const char __user *buf, size_t count,
                loff_t *f_pos)
{
    char data[2];

    copy_from_user(data, buf, count);
    gpio_direction_output(LED_GPIO, data[0]);

    return count;
}

static int gpio_ioctl(struct inode *inode,struct file *flip,unsigned int command,unsigned long arg)
{
    int data;

    switch (command) {
    case 0: 
        gpio_direction_output(LED_GPIO, 0);
        break;

    case 1:
        gpio_direction_output(LED_GPIO, 1);
        break;
    }

    return 0;
}

static struct file_operations gpio_fops={
    .owner      = THIS_MODULE,
    .open       = gpio_open,
    .write      = gpio_write,
    .release    = gpio_release,
    .ioctl      = gpio_ioctl,
};

static struct miscdevice gpio_miscdev = {
    .minor  = MISC_DYNAMIC_MINOR,
    .name   = DEVICE_NAME,
    .fops   = &gpio_fops,
};  

static int __init gpio_init(void)
{

    misc_register(&gpio_miscdev);
    printk(DEVICE_NAME" up. \n"); 

    return 0;
}

static void __exit gpio_exit(void)
{
    misc_deregister(&gpio_miscdev);
    printk(DEVICE_NAME " down.\n");
}

module_init(gpio_init);
module_exit(gpio_exit);

MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("zhuguojun, ZhiYuan Electronics Co, Ltd.");
MODULE_DESCRIPTION("GPIO DRIVER FOR EasyARM-i.MX28xx");

Makefile很关键,要指明自己所有的内核原文件。

PWD:=$(shell pwd)
obj-m:=led.o
module-objs := led.o
KERNEL_SRC = /usr/src/linux-2.6.35.3/
KDIR:=$(KERNEL_SRC)
all:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
    rm -rf *.ko *.order *.symvers *.cmd *.o *.mod.c *.tmp_versions .*.cmd .tmp_versions

注意里面的段前空格全是TAB

第一就是环境,这里通过 sudo -s 切换环境 然后make

root@linux-compiler:~/led$sudo -s
这里的使用方式是迫不得已,使用了官方的ubuntu12.04环境,找不到arm-fsl-linux-gnueabi-gcc 交叉编译器,切换一下环境就可以了,后面再瞧瞧,暂且先这么干,有高手看见望指点一下。
root@linux-compiler:~/led#make

yes,生成了led.ko等文件,就可以挂载了,写个测试文件跑跑就可以了。

一切就顺利成章,其他的gpio、adc等也是类似,不过要针对报错的头文件,指明调用路径。

*注:本人愚钝,难免有理解不到位的地方,相互学习吧,希望能帮助后来者。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值