• 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

  • 相关阅读:
    VS自带的dbghelp.h文件 报错
    Windows 自带的截屏功能
    CentOS 7 安装
    Windows 远程连接 CentOS 7 图形化桌面
    <<、|=、&的小例子
    pip 安装库过慢
    pip -i 和 -U 参数
    windows下安装TA-Lib库
    vector、map 判断某元素是否存在、查找指定元素
    vector push_back报错
  • 原文地址:https://www.cnblogs.com/baoshulin/p/6400892.html
Copyright © 2020-2023  润新知