02day led灯01

//加载的时候,点亮led灯,卸载模块,关闭led灯
/*
核心版中一共有4个led灯
高电平灭,低电平亮
GPM4_0
GPM4_1
GPM4_2
GPM4_3

0x110002e0

方法1:
linux  封装的gpio口操作

编译Linux内核已经把tiny4412_leds.c 这个驱动加载到内核中,
使用gpio_requeset申请gpio管脚就会冲突,所以需要重新编译内核。
把make menuconfig -->Device Drivers  --->Character devices  --->
LED Support for FriendlyARM Tiny4412 GPIO LEDs
去掉
M  表示 内核再编译,会把该.c文件,编译生成对应.ko文件。此时需要手动把该模块插入到内核中
*    编译到内核中
空  不做任何的编译

include/linux 所有的头文件和平台无关

gpio_request(gpio口端口, 名称);
gpio_free

    int gpio_direction_input(unsigned gpio);
    设置成gpio端口为输入模式,返回值是该端口的电平信号

    int gpio_direction_output(unsigned gpio, int value);
    设置成gpio端口为输出模式,value 输出高低电平

#include <mach/gpio.h>
GPIO端口地址可以使用EXYNOS4X12_GPM4宏


bootcmd:
set bootargs "noinitrd root=/dev/nfs rw nfsroot=192.168.0.90:/home/candle/nfsroot ip=192.168.0.100 console=ttySAC0,115200 init=/linuxrc lcd=S70"
nfsroot 路径 根据具体情况而定


zImage  必须拷贝40008000
set bootcmd 'dnw  0x40008000;bootm 0x40008000'
*/


#include <linux/module.h>  //MODULE_LICENSE("GPL");
#include <linux/init.h>   //module_init  module_exit
#include <linux/kernel.h>  //printk

#include <linux/gpio.h>
//gpio_request   gpio_direction_output     和平台无关的
#include <mach/gpio.h> //EXYNOS4X12_GPM4
//EXYNOS4X12_GPM4(0)

struct gpio_desc
{
    unsigned int  num;  //gpio口编号
    const char * name;    //gpio口名称
    int  value;   //gpio的值
};

struct gpio_desc  led_gpio[] = {
    {EXYNOS4X12_GPM4(0), "LED0",  0},
    {EXYNOS4X12_GPM4(1), "LED1",  1},
    {EXYNOS4X12_GPM4(2), "LED2",  1},
    {EXYNOS4X12_GPM4(3), "LED3",  0},
};

//#define  GPM4CON *(volatile  u32 *)0x110002e0
//加载
static int test_init(void)
{

    int ret = 0;
    int i = 0;
    //内核是用printk打印
    printk("%s:%s:%d   load ", __FILE__, __FUNCTION__, __LINE__);
     //GPM4CON = (GPM4CON & ~0xf) | 1 << 0;
    //linux 支持虚拟内存,所以所有的地址都是虚拟,不能直接


    for(i=0;i < ARRAY_SIZE(led_gpio);i++) {
        //向内核中注册GPIO
        ret = gpio_request(led_gpio[i].num, led_gpio[i].name);
        if(ret < 0) {
            printk("gpio_request  name:%s   failed ", led_gpio[i].name);
            goto  err_gpio_request;
        }
        gpio_direction_output(led_gpio[i].num, led_gpio[i].value);
    }

    return 0;

err_gpio_request:
    for(i=i-1;i>=0;i--) {
        gpio_free(led_gpio[i].num);
    }

    return -1;
}

//卸载
static void test_exit(void)
{
    int i =0;
    printk("%s:%s:%d   reload ", __FILE__, __FUNCTION__, __LINE__);

    for(i=0;i < ARRAY_SIZE(led_gpio);i++) {
        gpio_free(led_gpio[i].num);
    }

}

module_init(test_init);
module_exit(test_exit);


MODULE_LICENSE("GPL");  //加入GPL许可


--------------------------------------------

obj-m := test.o

#添加当前的系统的路径
#uname -r  查看当前系统的内核版本,
#指定内核的地址
#KERNEL_DIR := /usr/src/linux-headers-3.19.0-15-generic

KERNEL_DIR:= ~/4412_res/linux/linux-3.5
NFSROOT := ~/nfsroot/

all: build

build:
    make -C $(KERNEL_DIR) M=$(PWD) modules
    cp test.ko  ~/nfsroot/
    make clean

copy:
    mv $(obj-m:.o=.ko) $(NFSROOT)

clean:
    make -C $(KERNEL_DIR) M=$(PWD) clean

.PHONY: all build copy clean

原文地址:https://www.cnblogs.com/baoshulin/p/6400892.html