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

📄 test7121.c

📁 SAA7121 Linux 驱动源码,此设备驱动依赖于Linux总线驱动。
💻 C
字号:
#include <stdlib.h>
#include <stdio.h>
#include <linux/fb.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <linux/videodev.h>
#include <linux/video_encoder.h>

#define PHSTBFB_IOCTL_BASE 0xF0
#define PH_STBFB_GET_RENDERERID _IOR(PHSTBFB_IOCTL_BASE,0,__u32)
#define ENCODER_SET_REG _IOW('e',10,int)
#define ENCODER_GET_REG _IOWR('e',11,int)
typedef enum outputMode{
	PAL,
	NTSC,
}outputMode;
typedef enum outputStatus{
	OFF,
	ON,
}outputStatus;
int setStatus=0;
int setMode =0;
int readReg = 0;
int setReg = 0;

outputMode saa7121_OutPut_Mode;
outputStatus saa7121_OutPut_Status;

static void printHelp(const char *appName)
{
   	printf("%s : Set saa7121h register function.\n",appName);
	printf("Optoins:\n");
	printf("	-h	show this screen\n");
	printf("	-s <register>  [value]	set/read register value.\n" );
	printf("		<register> 	range : 0x00 ~ 0x7f.\n");
	printf("		[value]    	range : 0x00 ~ 0x7f.\n");
	printf("	-o <pal | ntsc>		set output mode.\n");
	printf("	-e <on | off>		set output status.\n");

}
/*
unsigned long strtoul(const char *str, char **endptr, int requestedbase, int *ret)
{
        unsigned long num = 0;
        char c;
        __u8 digit;
        int base = 10;
        int nchars = 0;
        int leadingZero = 0;

        *ret = 0;

        while ((c = *str) != 0) {
                if (nchars == 0 && c == '0') {
                        leadingZero = 1;
                        printf("strtoul(): leadingZero nchar=%d", nchars);
                        goto step;
                } else if (leadingZero && nchars == 1) {
                        if (c == 'x') {
                                base = 16;
                                printf("strtoul(): base 16 nchars=%d", nchars);
                                goto step;
                        } else if (c == 'o') {
                                base = 8;
                                printf("strtoul(): base8 nchars=%d", nchars);
                                goto step;
                        }
                }
                printf("strtoul: c=%c", c);
                if (c >= '0' && c <= '9') {
                        digit = c - '0';
                } else if (c >= 'a' && c <= 'z') {
                        digit = c - 'a' + 10;
                } else if (c >= 'A' && c <= 'Z') {
                        digit = c - 'A' + 10;
                } else {
                        *ret = 3;
                        return 0;
                }
                if (digit >= base) {
                        *ret = 4;
                        return 0;
                }
                num *= base;
                num += digit;
step:
                str++;
                nchars++;

        }
        return num;
}
*/

int main(int argc, char** argv)
{
   int fb=0;
   int i = 0;
   int reg = -1;
   int value = -1;
   unsigned long setting = 0;

   fb = open("/dev/saa7121",O_RDONLY);
   if( fb<0){
      printf("open /dev/saa7121 error!\n");
      return 1;
   }
   if (argc == 1 || (strcmp(argv[1], "-h") == 0))
   {
        printHelp(argv[0]);
        return 0;
   }
 
   for (i=1; i<argc; i++)	{
         if (strcmp(argv[i], "-s") == 0){
		if ((i+1) < argc ){ 	
			reg = strtoul(argv[i+1],NULL,0);
			readReg = 1;
			setReg = 0;
			if (((i+2) < argc)){
				value = strtoul(argv[i+2],NULL,0);
				setReg = 1;
				readReg = 0;
			}
		}else{
			printHelp(argv[0]);
			return 1;
		}
	  }
         if (strcmp(argv[i], "-o") == 0){
		if ((i+1) < argc){
			switch ( argv[i+1][0]){
			case 'p':
				saa7121_OutPut_Mode = PAL;
				break;
			case 'n':
				saa7121_OutPut_Mode = NTSC;
				break;
			default:
				printHelp(argv[0]);
				return 1;
			}
			setMode = 1;
		}else{
			printHelp(argv[0]);
			return 1;
		}
         }
         if (strcmp(argv[i], "-e") == 0){
		if ((i+1) < argc){
			switch ( argv[i+1][1]){
			case 'n':
				saa7121_OutPut_Status = ON;
				break;
			case 'f':
				saa7121_OutPut_Mode = OFF;
				break;
			default:
				printHelp(argv[0]);
				return 1;
			}
			setStatus = 1;
		}else{
			printHelp(argv[0]);
			return 1;
		}
         }
    }
   if (!(setReg || readReg || setStatus|| setMode)){
		printHelp(argv[0]);
		return 1;   }
   if (setReg || readReg){
 	   if (reg < 0 || reg > 0xff)
	   {
	   	printf("Error register address %x! (0x00~0x7f) \n", reg);
		printHelp(argv[0]);
		return 1;
	   }
   }
   if (setReg)
   {
	   if (value < 0 || value > 0xff)
	   {
	   	printf("Errer register value! (0x00~0xff)\n");
		return 1;
	   }
	   setting = (reg & 0xff) << 8 | (value & 0xff);
	   printf("send setting value : 0x%08x\n", setting);
	   if (ioctl(fb, ENCODER_SET_REG,&setting) < 0){
	   		printf("Error set saa7121 register 0x%02x \n", reg);
		  	return 1;
	   }
	   printf("Set saa7121 register 0x%02x = 0x%02x.\n", reg,value);
	   return 0;
   }
   if (readReg){
   	   reg = reg & 0xff;
	   setting = reg & 0xff;
	   if (ioctl(fb, ENCODER_GET_REG,&setting ) < 0){
	      printf("Error read saa7121 register 0x%02x \n", reg);
		  return 1;
	   }
	   printf("Read saa7121 register at 0x%02x, value = 0x%02x.\n", reg,setting);
	   return 0;
   }
   if (setMode){
   	   if (saa7121_OutPut_Mode == NTSC)
   	   	setting = VIDEO_MODE_NTSC;
	   else
	   	setting = VIDEO_MODE_PAL;
	   if (ioctl(fb, ENCODER_SET_NORM,&setting ) < 0){
	      printf("Error set saa7121 output mode \n");
		  return 1;
	   }
	   return 0;
   }
   if (setStatus){
   	   if (saa7121_OutPut_Status == ON)
   	       setting = 1;
	   else
	   	setting = 0;
	   if (ioctl(fb, ENCODER_ENABLE_OUTPUT,&setting ) < 0){
	      printf("Error set saa7121 power status\n");
		  return 1;
	   }
	   return 0;
   }
   return 0;    
   /*
   opterr = 0;
   while ((c = getopt(argc, argv, ":r:v:h")) > 0);
   {
        switch (c)
        {
            case 'h':
                printHelp(argv[0]);
                break;
				
            case 'r':
		    printf("option r:'%s'\n",optarg);
                reg = atoi(optarg);
		   break;
		   
            case 'v':
		   printf("option v:'%s'\n",optarg);		
                value = atoi(optarg);
		    readval = 0;
                break;
		default:
                printf( "%s: Unrecognised option -- %c\n", argv[0], optopt);
                break;
        }
   }
   */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -