s3c2440通过GPIO口控制三块74HC595的电路图为如下:

驱动为:

 
  
  1. /*************************************  
  2.  
  3. NAME:Con595.c  
  4. 通过一个GPIO口来控制24个LED灯的明亮。  
  5.  
  6. *************************************/ 
  7. #include <linux/miscdevice.h>  
  8. #include <linux/delay.h>  
  9. #include <mach/regs-gpio.h>  
  10. #include <mach/regs-gpioj.h>  
  11. #include <mach/hardware.h>  
  12. #include <linux/kernel.h>  
  13. #include <linux/module.h>  
  14. #include <linux/init.h>  
  15. #include <linux/mm.h>  
  16. #include <linux/fs.h>  
  17. #include <linux/types.h>  
  18. #include <linux/delay.h>  
  19. #include <linux/moduleparam.h>  
  20. #include <linux/slab.h>  
  21. #include <linux/errno.h>  
  22. #include <linux/ioctl.h>  
  23. #include <linux/cdev.h>  
  24. #include <linux/string.h>  
  25. #include <linux/list.h>  
  26. #include <linux/pci.h>  
  27. #include <asm/uaccess.h>  
  28. #include <asm/atomic.h>  
  29. #include <asm/unistd.h>  
  30. #include <linux/gpio.h>  
  31.  
  32.  
  33. //#undef DEBUG  
  34.  #define DEBUG  
  35.  #ifdef DEBUG  
  36.  #define DPRINTK(x...) {printk(x);}  
  37.  #else  
  38.  #define DPRINTK(x...) (void)(0)  
  39.  #endif  
  40.  
  41. #define DEFAULT 2  
  42. #define ON 1  
  43. #define OFF 0  
  44.  
  45. #define DEVICE_NAME "Control_595"  
  46. unsigned  int Current_LED_State =0xffffffff; //初始化全部都亮。  
  47. /*=============================================================  
  48. 函数名:OnOffLed  
  49. 功能:对各个灯的控制。  
  50. 参数:pin:表示第几个灯。范围0~23  
  51.      On_Off:表示灯的状态。  
  52. ==============================================================*/ 
  53. static void OnOffLed(int pin,int On_Off)  
  54. {  
  55.     int temp;  
  56.     int j;  
  57.     if(On_Off==0)  
  58.     {  
  59.         Current_LED_State |=1<<pin;//这是控制灯亮  
  60.     }  
  61.     else if(On_Off==1)  
  62.     {  
  63.         Current_LED_State &=~(1<<pin);//这是在控制灯暗  
  64.     }  
  65.     else if(On_Off==2 )  
  66.     {  
  67.         Current_LED_State=0xffffffff;  
  68.     }  
  69.     else if(On_Off==3)  
  70.     {  
  71.         Current_LED_State=0;  
  72.     }  
  73.     else 
  74.     {  
  75.         printk("Enter error!");  
  76.     }  
  77.  
  78.     temp=j=0;  
  79.     DPRINTK("1:Current_LED_State:%04x\n",Current_LED_State);  
  80.     while(j<24)   
  81.     //(int j=0;j<24;j++)  
  82.         {  
  83.             temp = (Current_LED_State>>j) & 0x00000001;//这是把当前的一位取出来。  
  84.              DPRINTK("2-%d,bit-%d:Current_LED_State:%04x;\n",j,temp,Current_LED_State);  
  85.             //打开引脚SI的电平  
  86.             s3c2410_gpio_setpin(S3C2440_GPJ0,temp);//   
  87.  
  88.             //SRCK产生一个脉冲,上升沿就把就移位。也就是说上升沿有效。  
  89.             s3c2410_gpio_setpin(S3C2440_GPJ2,0);  
  90.                 udelay(200);//这是微秒级的。  
  91.             s3c2410_gpio_setpin(S3C2440_GPJ2,1);  
  92.             j++;          
  93.                       
  94.         }  
  95.  
  96.    //到这里就控制RCK上升沿来把移位寄存器的数据移到数据寄存器。RCK一般保持正脉冲。  
  97.                 s3c2410_gpio_setpin(S3C2440_GPJ1,0);  
  98.             udelay(200);  
  99.             s3c2410_gpio_setpin(S3C2440_GPJ1,1);  
  100.  
  101.       
  102. }  
  103.  
  104. /*=============================================================  
  105. 函数名:tq2440_gpio_ioctl().  
  106. 功能:通过系统函数ioctl来设置那一个灯暗亮。  
  107. 参数: cmd:是发送的命令。ON 表示亮,OFF表示暗。DEFAULT表示默认全部灯变亮。  
  108.     arg:表示那一个灯变亮。范围为0~23  
  109. ==============================================================*/ 
  110. static int tq2440_gpio_ioctl(  
  111.     struct inode *inode,   
  112.     struct file *file,   
  113.     unsigned int cmd,   
  114.     unsigned int arg)  
  115. {  
  116.     DPRINTK("enter to the ioctl\n");  
  117.     if (arg > 24)  
  118.     {  
  119.         return -EINVAL;  
  120.     }  
  121.  
  122.     switch(cmd)  
  123.     {  
  124.         case ON:  
  125.             // 设置指定引脚的输出电平为0  
  126.             DPRINTK("ON\n");  
  127.             OnOffLed(arg,ON);  
  128.             return 0;  
  129.         case OFF:  
  130.             // 设置指定引脚的输出电平为1  
  131.             DPRINTK("OFF\n");  
  132.             OnOffLed(arg,OFF);  
  133.             return 0;  
  134.           
  135.         case 3: //这个是低电平,也就是灯亮  
  136.             DPRINTK("3\n");       
  137.             OnOffLed(arg,3);  
  138.             return 0;  
  139.         case 4: //这是高电平,也就是灯亮  
  140.             DPRINTK("DEFAULT\n");         
  141.             OnOffLed(arg,2);  
  142.             return 0;  
  143.         default:  
  144.  
  145.             return -EINVAL;  
  146.     }  
  147. }  
  148.  
  149. static struct file_operations dev_fops = {  
  150.     .owner  =   THIS_MODULE,  
  151.     .ioctl  =   tq2440_gpio_ioctl,  
  152. };  
  153.  
  154. static struct miscdevice misc = {  
  155.     .minor = MISC_DYNAMIC_MINOR,  
  156.     .name = DEVICE_NAME,  
  157.     .fops = &dev_fops,  
  158. };  
  159.  
  160. /*=============================================================  
  161. 函数名:dev_init();  
  162. 功能:初始化连接74595和个引脚的初始化。分别有连接SIN ,SRCK RCK.  
  163. ==============================================================*/ 
  164. static int __init dev_init(void)  
  165. {  
  166.     int ret;  
  167.  
  168.     s3c2410_gpio_cfgpin(S3C2440_GPJ0, S3C2440_GPJ0_OUTP);  
  169.     s3c2410_gpio_setpin(S3C2440_GPJ0, 1);  
  170.       
  171.     s3c2410_gpio_cfgpin(S3C2440_GPJ1, S3C2440_GPJ1_OUTP);  
  172.     s3c2410_gpio_setpin(S3C2440_GPJ1, 1);  
  173.  
  174.         s3c2410_gpio_cfgpin(S3C2440_GPJ2, S3C2440_GPJ2_OUTP);  
  175.     s3c2410_gpio_setpin(S3C2440_GPJ2, 1);  
  176.  
  177. /*===========================================================  
  178. 以下是对ENIT5 ENIT6 ENTI7的初始化,这是对74595的管脚的使能  
  179. =============================================================*/ 
  180.     s3c2410_gpio_cfgpin(S3C2410_GPF(5), S3C2410_GPIO_OUTPUT);  
  181.     s3c2410_gpio_setpin(S3C2410_GPF(5), 0);   
  182.     s3c2410_gpio_cfgpin(S3C2410_GPF(6), S3C2410_GPIO_OUTPUT);  
  183.     s3c2410_gpio_setpin(S3C2410_GPF(6), 0);  
  184.         s3c2410_gpio_cfgpin(S3C2410_GPF(7), S3C2410_GPIO_OUTPUT);  
  185.     s3c2410_gpio_setpin(S3C2410_GPF(7), 0);   
  186.         OnOffLed(1,DEFAULT );  
  187.  
  188.  
  189.     ret = misc_register(&misc);  
  190.     printk(DEVICE_NAME" initialized\n");  
  191.     return ret;  
  192. }  
  193.  
  194. static void __exit dev_exit(void)  
  195. {  
  196.     misc_deregister(&misc);  
  197.     DPRINTK("unload!\n");  
  198. }  
  199.  
  200. module_init(dev_init);  
  201. module_exit(dev_exit);  
  202.  
  203. MODULE_LICENSE("GPL");  
  204. MODULE_AUTHOR("Li");  
  205. MODULE_DESCRIPTION("GPIO Control 74HC595"); 

 

 

测试代码为:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/fs.h>
#include <errno.h>
#include <string.h>
#include"test595.h"
int main()
{
  int fd,cmd,arg;
 fd = open("/dev/Control_595", 0);
 if (fd < 0)
 {
  perror("open ADC device !");
  exit(1);
 }
while (1)
{
      printf("Please your led:(0~23).\n");
      scanf("%d",&arg);
      scanf("%d",&cmd);
      printf("cmd:%d, arg:%d\n",cmd,arg);
      //ioctl(fd,cmd,arg);
 CONFIG_SW(fd,cmd,arg);
 
}

return 0;

}