⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testled.c

📁 px270平台下的led灯显示驱动源码,通过bc7281键盘芯片来驱动,可以实现四个(可扩展)led数码管的任意显示
💻 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 + -