zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    POJ3159 Candies —— 差分约束 spfa
    POJ1511 Invitation Cards —— 最短路spfa
    POJ1860 Currency Exchange —— spfa求正环
    POJ3259 Wormholes —— spfa求负环
    POJ3660 Cow Contest —— Floyd 传递闭包
    POJ3268 Silver Cow Party —— 最短路
    POJ1797 Heavy Transportation —— 最短路变形
    POJ2253 Frogger —— 最短路变形
    POJ1759 Garland —— 二分
    POJ3685 Matrix —— 二分
  • 原文地址:https://www.cnblogs.com/baoshulin/p/6400892.html
Copyright © 2011-2022 走看看