📄 testled.c
字号:
#include <linux/config.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/miscdevice.h>#include <linux/sched.h>#include <linux/delay.h>#include <linux/poll.h>#include <linux/spinlock.h>#include <asm/irq.h>#include <linux/delay.h>#include <asm/hardware.h>#define GPIO_11 11#define GPIO_91 91#define GPIO_17 17//--------------------------------------------------------static void delay(int nu){ int i,j; j=nu*20; for(i=1;i<j;i++) mdelay(50);}static void read_GPIO_state(int gpio_port){ if((GPDR(gpio_port)&GPIO_bit(gpio_port))) printk("GPIO%d pin's direction is out\n",gpio_port); else printk("GPIO%d pin's direction is in\n",gpio_port); if((GPLR(gpio_port)&GPIO_bit(gpio_port))) printk("GPIO%d pin's voltage is high\n",gpio_port); else printk("GPIO%d pin's voltage is low\n",gpio_port);}static void GPIO_init(void){ set_GPIO_mode(GPIO_11|GPIO_IN);//dat set_GPIO_mode(GPIO_17|GPIO_IN);//key set_GPIO_mode(GPIO_91|GPIO_OUT);//clk}//the valid moment of a clk is the falling edge,we set the clk pin low first,so while//calling send_a_clock ,wo get the falling edge immediately, static void send_a_clock(int gpio_port){ GPCR(gpio_port)|=GPIO_bit(gpio_port); udelay(4); GPSR(gpio_port)|=GPIO_bit(gpio_port); udelay(3);}//GPIO_write_bit send the highest bit of a byte,itcost 3us while is calledstatic int GPIO_write_bit(int gpio_port,int data_write){ unsigned i,tmp; int mask=0x80; set_GPIO_mode(GPIO_11|GPIO_OUT);// set dat pin out first tmp=data_write; tmp&=mask; i=tmp; if(i) GPSR(gpio_port)|=GPIO_bit(gpio_port);//gpio_port pin export 1 else GPCR(gpio_port)|=GPIO_bit(gpio_port);//gpio_port pin export 0}static int GPIO_read_bit(int gpio_port) { set_GPIO_mode(gpio_port|GPIO_IN);//set dat pin in first if(GPLR(gpio_port)&GPIO_bit(gpio_port)) return 1; else return 0;}static int BC7281_read_reg(int reg_nr){ unsigned long i; int reg,data; data=0; reg=reg_nr; reg|=0x80; //read cmd//send the cmd byte,the cmd contends register address and r/w bit do { send_a_clock(GPIO_91); } while((GPLR(GPIO_11)&GPIO_bit(GPIO_11)));//send clks until dat turn to low send_a_clock(GPIO_91); while(!(GPLR(GPIO_11)&GPIO_bit(GPIO_11)));//when dat turn to low ,we send a clk ,and wait dat turn to //high (dat pin of 7281 mod is in ) for(i=0;i<8;i++) //send 8 bit { GPIO_write_bit(GPIO_11, reg); reg=reg*2; send_a_clock(GPIO_91); udelay(5);//the output status should keep for more than 5us,so that 7281can read it } GPSR(GPIO_11)|=GPIO_bit(GPIO_11); set_GPIO_mode(GPIO_11|GPIO_IN); //set gpio11 direction to in before reading from 7281//read from reg in bc7281 send_a_clock(GPIO_91); while(GPLR(GPIO_11)&GPIO_bit(GPIO_11));//send only one clk,and wait until dat turn to low send_a_clock(GPIO_91);// when dat pin turn to low ,we send a clk,7281 send a bit for(i=0;i<8;i++) { udelay(2); data<<1; if(GPLR(GPIO_11)&GPIO_bit(GPIO_11)) data|=0x01; send_a_clock(GPIO_91); } return data; }static int BC7281_write_reg(int reg_nr,int command){ unsigned long i; int reg= reg_nr; int cmd=command;//send the cmd byte,the cmd contends register address and r/w bit do { send_a_clock(GPIO_91); } while((GPLR(GPIO_11)&GPIO_bit(GPIO_11)));//send clks until dat turn to low send_a_clock(GPIO_91); while(!(GPLR(GPIO_11)&GPIO_bit(GPIO_11)));//when dat turn to low ,we send a clk ,and wait dat turn to //high (dat pin of 7281 mod is in ) for(i=0;i<8;i++) //send 8 bit { GPIO_write_bit(GPIO_11, reg); reg=reg*2; send_a_clock(GPIO_91); udelay(5); } set_GPIO_mode(GPIO_11|GPIO_IN);//send the data byte,the byte to write to 7281 do { send_a_clock(GPIO_91); } while((GPLR(GPIO_11)&GPIO_bit(GPIO_11))); send_a_clock(GPIO_91); while(!(GPLR(GPIO_11)&GPIO_bit(GPIO_11))); for(i=0;i<8;i++) { GPIO_write_bit(GPIO_11, cmd); cmd=cmd*2; send_a_clock(GPIO_91); udelay(5); } set_GPIO_mode(GPIO_11|GPIO_IN);//don't forget wo set gpio11 mod in.}static int BC7281_init(void){ int data=0x80; int reg=0x12; printk("BC7281 init... ...\n"); BC7281_write_reg(reg, data);//set control reg , BC7281_read_reg(0x13);}static int __init LED_init(void){ int i,key; int readstate=0; printk("module init... ...\n"); GPIO_init(); printk("read gpio state after init\n"); read_GPIO_state(11); read_GPIO_state(17); read_GPIO_state(91); BC7281_init(); for(i=0;i<1;i++) { // 0 BC7281_write_reg(0x00,0xc0); //BC7281_write_reg(0x01,0xc0); //BC7281_write_reg(0x02,0xc0); //BC7281_write_reg(0x03,0xc0); delay(1); // 1 //BC7281_write_reg(0x00,0xf9); BC7281_write_reg(0x01,0xf9); //BC7281_write_reg(0x02,0xf9); //BC7281_write_reg(0x03,0xf9); delay(1); // 2 //BC7281_write_reg(0x00,0xa4); //BC7281_write_reg(0x01,0xa4); BC7281_write_reg(0x02,0xa4); //BC7281_write_reg(0x03,0xa4); delay(1); // 3 //BC7281_write_reg(0x00,0xb0); //BC7281_write_reg(0x01,0xb0); //BC7281_write_reg(0x02,0xb0); BC7281_write_reg(0x03,0xb0); delay(1); // 4 /*BC7281_write_reg(0x00,0x99); BC7281_write_reg(0x01,0x99); BC7281_write_reg(0x02,0x99); BC7281_write_reg(0x03,0x99); delay(1); // 5 BC7281_write_reg(0x00,0x92); BC7281_write_reg(0x01,0x92); BC7281_write_reg(0x02,0x92); BC7281_write_reg(0x03,0x92); delay(1); // 6 BC7281_write_reg(0x00,0x82); BC7281_write_reg(0x01,0x82); BC7281_write_reg(0x02,0x82); BC7281_write_reg(0x03,0x82); delay(1); // 7 BC7281_write_reg(0x00,0xf8); BC7281_write_reg(0x01,0xf8); BC7281_write_reg(0x02,0xf8); BC7281_write_reg(0x03,0xf8); delay(1); // 8 BC7281_write_reg(0x00,0x80); BC7281_write_reg(0x01,0x80); BC7281_write_reg(0x02,0x80); BC7281_write_reg(0x03,0x80); delay(1); // 9 BC7281_write_reg(0x00,0x90); BC7281_write_reg(0x01,0x90); BC7281_write_reg(0x02,0x90); BC7281_write_reg(0x03,0x90); delay(1);*/ } BC7281_write_reg(0x12, 0x00); BC7281_init(); key=BC7281_read_reg(0x13); printk("the key is:%d",key); printk("init over!\n"); return 0;}static void __exit LED_exit(void){ printk("module exit\n");}//----------------------------------------------------------MODULE_AUTHOR("liuxianyu"); MODULE_LICENSE("GPL"); module_init(LED_init); module_exit(LED_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -