S3C2440扩展引脚普通IO的驱动源码

本文介绍了一个基于S3C2410处理器的LED驱动程序实现细节,包括GPIO寄存器配置、LED控制函数及字符设备操作等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 #include <linux/config.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/io.h>
#include <asm/uaccess.h>

#define NAME "led_drv"
static int major = 231;
//MODULE_AUTHOR("gec");
//MODULE_DESCRIPTION("LED Driver");
//MODULE_LICENSE("GPL");
//module_param(major, int, 0);
//MODULE_PARM_DESC(major, "Major device number");

#define S3C2410_ADDR(x)   (0xF0000000 + (x))
#define S3C24XX_VA_GPIO    S3C2410_ADDR(0x00E00000)
#define S3C2410_GPIOREG(x) ((x) + S3C24XX_VA_GPIO)

#define S3C2410_GPACON    *((volatile unsigned long*)S3C2410_GPIOREG(0x00))
#define S3C2410_GPADAT    *((volatile unsigned long*)S3C2410_GPIOREG(0x04))

// 用到B6,B0?
// Port B
#define S3C2410_GPBCON    *((volatile unsigned long*)S3C2410_GPIOREG(0x10))
#define S3C2410_GPBDAT    *((volatile unsigned long*)S3C2410_GPIOREG(0x14))
#define S3C2410_GPBUP    *((volatile unsigned long*)S3C2410_GPIOREG(0x18))
//用到G7,G6?
// Port G
#define S3C2410_GPGCON    *((volatile unsigned long*)S3C2410_GPIOREG(0x60))
#define S3C2410_GPGDAT    *((volatile unsigned long*)S3C2410_GPIOREG(0x64))
#define S3C2410_GPGUP    *((volatile unsigned long*)S3C2410_GPIOREG(0x68))

#define Led1_ON()       (S3C2410_GPBDAT &= ~(1<<6))
#define Led1_OFF()      (S3C2410_GPBDAT |= (1<<6))
#define Led2_ON()       (S3C2410_GPBDAT &= ~(1<<0))
#define Led2_OFF()      (S3C2410_GPBDAT |= (1<<0))
#define Led3_ON()       (S3C2410_GPGDAT &= ~(1<<7))
#define Led3_OFF()      (S3C2410_GPGDAT |= (1<<7))
#define Led4_ON()       (S3C2410_GPGDAT &= ~(1<<6))
#define Led4_OFF()      (S3C2410_GPGDAT |= (1<<6))

 


/*
 * LedDisp函数根据参数led来显示相应的Led。
 */
void LedDisp(int led)
{
    int mask;
    // 某位位置为1点亮,否则熄灭,可无限添加更多效果
    // 0 全灭, 1-4依次单独点亮灯1-4,熄灭其余
    int arr_mask[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,};// 效果掩码
    if( led < 0 || led >= (sizeof(arr_mask)/sizeof(arr_mask[0])) )
        return;
    mask = arr_mask[led];// 根据输入的数字选择效果

    (mask & (1<<0)) ?  Led1_ON() :  Led1_OFF(); // 对应位置为1点亮,否则熄灭
    (mask & (1<<1)) ?  Led2_ON() :  Led2_OFF();
    (mask & (1<<2)) ?  Led3_ON() :  Led3_OFF();
    (mask & (1<<3)) ?  Led4_ON() :  Led4_OFF();
}

static int led_drv_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
 printk("led- ioctl: param %u %lu/n", cmd, arg);
    LedDisp(arg);
 return 0;
}

static int led_drv_open(struct inode *inode, struct file *file)
{
  unsigned m = iminor(inode);
  if (m > 63)
   return -EINVAL;
  printk("LED driver opened!/n");
  return nonseekable_open(inode, file);
}

static int led_drv_release(struct inode *inode, struct file *file)
{
  printk("LED driver released!/n");
  return 0;
}

static struct file_operations led_drv_fops = {
  .owner   = THIS_MODULE,
  .ioctl   = led_drv_ioctl,
  .open    = led_drv_open,
  .release = led_drv_release,
};

static int __init led_drv_init(void)
{
    int temp;
 int ret;
 unsigned long tmp;
  printk("LED Driver./n");
 /* 注册LED设备 */
 ret = register_chrdev(major, NAME, &led_drv_fops);
  if (ret < 0) {
    printk("Unable to register character device!/n");
    return ret;
  }
 /*
  *初始化GPA-IO寄存器
  */
  // B6,B0,G7,G6 for output
 temp = S3C2410_GPBCON & (~((3<<12) | (3<<0))); // 屏蔽
 S3C2410_GPBCON = temp | (1<<12) | (1<<0);

 temp = S3C2410_GPGCON & (~((3<<14) | (3<<12))); // 屏蔽
 S3C2410_GPGCON = temp | (1<<14) | (1<<12);

    // 是否上拉
    S3C2410_GPBUP &= ~((1<<6) | (1<<0));  // enable poll up
    S3C2410_GPGUP &= ~((1<<7) | (1<<6));  // enable poll up

    //S3C2410_GPBUP |= (1<<6) | (1<<0);  // disable poll up
    //S3C2410_GPGUP |= (1<<7) | (1<<6);  // disable poll up


    // 初始化B6,B0,G7,G6输出高电平,可能点亮或者熄灭LED
    S3C2410_GPBDAT |= (1<<6) | (1<<0);
    S3C2410_GPGDAT |= (1<<7) | (1<<6);


 printk("LED Test Driver initiated./n");
 return 0;
}
static void __exit led_drv_cleanup(void)
{
  int ret;
  ret = unregister_chrdev(major, NAME);
  if (ret < 0)
    printk("Unable to register character device!/n");
  else
    printk("LED Test Driver unloaded!");
}
module_init(led_drv_init);
module_exit(led_drv_cleanup);

 

linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |-- alsa-oss-1.0.15.tar.bz2 | | |-- alsa-tools-1.0.15.tar.bz2 | | |-- alsa-utils-1.0.13.tar.bz2 | | `-- pyalsa-1.0.15.tar.bz2 | |-- ALSA驱动范例 | | |-- sa11xx-uda1341.c | | `-- uda1341.h | |-- ALSA应用程序范例 | | |-- pcm.c | | `-- pcm_min.c | |-- OSS驱动范例 | | `-- s3c2410-uda1341.c | `-- OSS应用程序范例 | |-- mixer.c | `-- sound.c |-- 18 | |-- FRAMEBUFFER应用程序范例 | | `-- fb_display | | |-- fb_display.c | | |-- fb_display.h | | |-- Makefile | | |-- README | | `-- test.c | `-- S3C2410 LCD驱动 | |-- s3c2410fb.c | `-- s3c2410fb.h |-- 19 | |-- busybox源代码 | | `-- busybox-1.2.1.tar.bz2 | |-- MTD工具 | | `-- mtd-utils-1.0.0.tar.gz | |-- nand驱动范例 | | `-- s3c2410.c | |-- nor驱动范例 | | `-- s3c2410nor.c | `-- yaffs&yaffs2源代码 | |-- yaffs.tar.gz | `-- yaffs2.tar.gz |-- 20 | |-- USB串口驱动 | | |-- usb-serial.c | | `-- usb-serial.h | |-- USB工具 | | `-- usbview-1.0.tar.tar | |-- USB骨架程序 | | `-- usb-skeleton.c | |-- USB键盘驱动 | | |-- input.h | | |-- usb_input.h | | `-- usbkbd.c | `-- usb主机控制器驱动范例 | |-- ohci-s3c2410.c | `-- usb-control.h |-- 21 | |-- PCI骨架程序 | | `-- pci-skeleton.c | `-- PCI驱动范例 | `-- i810_audio.c `-- 22 |-- 范例代码 | |-- oops范例 | | |-- oops_example.asm | | `-- oops_example.c | `-- proc范例 | `-- sim_proc.c `-- 内核调试工具 |-- ddd-3.3.11.tar.gz |-- gdbmod-2.4.bz2 |-- kdb-v4.4-2.6.15-rc5-common-1.bz2 |-- kdb-v4.4-2.6.15-rc5-common-2.bz2 |-- kdb-v4.4-2.6.15-rc5-i386-1.bz2 `-- linux-2.6.15.5-kgdb-2.4.tar.tar 73 directories, 91 files
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值