Skip to content

Instantly share code, notes, and snippets.

@pearagit
Created January 4, 2024 23:25
Show Gist options
  • Save pearagit/ceffd628a44c4b97583445744b12cc5c to your computer and use it in GitHub Desktop.
Save pearagit/ceffd628a44c4b97583445744b12cc5c to your computer and use it in GitHub Desktop.
diff -ur SDInstall/config.txt SDInstall_DMG/config.txt
--- SDInstall/config.txt	2022-03-24 16:13:42.000000000 -0700
+++ SDInstall_DMG/config.txt	2021-01-01 14:18:02.000000000 -0800
@@ -11,15 +11,14 @@
 #over_voltage=6
 #hdmi_enable_4kp60=1
 
-gpu_mem=512
-initial_turbo=60
-
 [all]
 ##Base Settings
 avoid_warnings=2
+gpu_mem=512
 disable_overscan=1
 disable_splash=1
 boot_delay=0
+initial_turbo=60
 force_eeprom_read=0
 
 ##Enable DPI gpio
Binary files SDInstall/payload/home/pi/osd/osd and SDInstall_DMG/payload/home/pi/osd/osd differ
Only in SDInstall/payload/home/pi/osd/resources: menu.png
diff -ur SDInstall/payload/usr/src/xpi_gamecon-1.0/xpi_gamecon.c SDInstall_DMG/payload/usr/src/xpi_gamecon-1.0/xpi_gamecon.c
--- SDInstall/payload/usr/src/xpi_gamecon-1.0/xpi_gamecon.c	2022-08-22 18:04:14.000000000 -0700
+++ SDInstall_DMG/payload/usr/src/xpi_gamecon-1.0/xpi_gamecon.c	2022-03-10 18:14:54.000000000 -0800
@@ -1,8 +1,3 @@
-#include <linux/platform_device.h>
-#include <linux/power_supply.h>
-#include <linux/err.h>
-#include <linux/errno.h>
-#include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/input.h>
 #include <linux/of_device.h>
@@ -12,27 +7,9 @@
 #include <asm/io.h>
 
 MODULE_AUTHOR("Nathan Scherdin");
-MODULE_DESCRIPTION("Experimental Pi Controls driver");
+MODULE_DESCRIPTION("PiBoy DMG Controls driver");
 MODULE_LICENSE("GPL");
 
-#define EXPI_MANUFACTURER	"Experimental Pi"
-#define EXPI_DRIVER_NAME	"Experimental Pi Driver"
-
-struct expi {
-	struct	power_supply		*psy;
-	struct	power_supply_desc	psy_desc;
-	int	status;
-	bool	cable_plugged;
-};
-
-static const enum power_supply_property expi_props[] = {
-	POWER_SUPPLY_PROP_STATUS,
-	POWER_SUPPLY_PROP_VOLTAGE_NOW,
-	POWER_SUPPLY_PROP_CURRENT_NOW,
-	POWER_SUPPLY_PROP_CAPACITY,
-	POWER_SUPPLY_PROP_MODEL_NAME,
-};
-
 static struct gc *gc_base;
 static const int gc_gpio_clk = 26;
 static const int gc_gpio_data = 27;
@@ -65,7 +42,7 @@
 
 struct kobject *kobj_ref;
 
-#define GC_LENGTH 14
+#define GC_LENGTH 12
 
 #define GPIO_SET *(gpio+7)
 #define GPIO_CLR *(gpio+10)
@@ -77,23 +54,21 @@
 
 static volatile unsigned *gpio;
 
-static const short gc_btn[] = { 
-				BTN_TRIGGER_HAPPY3,		//DPAD Up
-				BTN_TRIGGER_HAPPY4,		//DPAD Down
-				BTN_TRIGGER_HAPPY1,		//DPAD Left
-				BTN_TRIGGER_HAPPY2,		//DPAD Right
-				BTN_A,				//A
-				BTN_B,				//B
-				BTN_X,				//X
-				BTN_Y,				//Y
-				BTN_TL,				//Left Button
-				BTN_TR,				//Right Button
-				BTN_TL2,			//Left Trigger
-				BTN_TR2,			//Right Trigger
-				BTN_THUMBL,			//Left Thumb
-				BTN_THUMBR,			//Right Thumb
-				BTN_SELECT,			//Select
-				BTN_START,			//Start
+static const short gc_btn[] = { BTN_A, //A
+				BTN_B, //B
+				BTN_C, //C
+				BTN_X, //X
+				BTN_Y, //Y
+				BTN_Z, //Z
+				BTN_SELECT, //Select
+				BTN_START, //Start
+				BTN_THUMBL, //Left Thumb
+				BTN_DPAD_UP, //DPAD Up
+				BTN_DPAD_DOWN, //DPAD Down
+				BTN_DPAD_LEFT, //DPAD Left
+				BTN_DPAD_RIGHT, //DPAD Right
+				BTN_TL, //Left Trigger
+				BTN_TR, //Right Trigger
 			};
 int gc_btn_size = sizeof(gc_btn);
 
@@ -145,50 +120,6 @@
 struct kobj_attribute stat = __ATTR(status, 0660, stat_show, stat_store);
 struct kobj_attribute vol = __ATTR(volume, 0660, vol_show, vol_store);
 
-static int expi_get_property(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val)
-{
-	int status;
-	struct expi *adc_bat = (struct expi *)power_supply_get_drvdata(psy);
-	if (!adc_bat) {
-		dev_err(&psy->dev, "no battery infos ?!\n");
-		return -EINVAL;
-	}
-
-	status = adc_bat->status;
-	adc_bat->cable_plugged = stat_val&0x80 ? 1 : 0;;
-
-	if (!adc_bat->cable_plugged)
-		adc_bat->status =  POWER_SUPPLY_STATUS_DISCHARGING;
-	else if (percent_val==100)
-		adc_bat->status = POWER_SUPPLY_STATUS_NOT_CHARGING;
-	else
-		adc_bat->status = POWER_SUPPLY_STATUS_CHARGING;
-
-	if (status != adc_bat->status)
-		power_supply_changed(adc_bat->psy);
-
-	switch (psp) {
-	case POWER_SUPPLY_PROP_STATUS:
-		val->intval = adc_bat->status;
-		break;
-	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
-		val->intval = batt_val;		//original; value in mv
-		break;
-	case POWER_SUPPLY_PROP_CURRENT_NOW:
-		val->intval = cur_val*10;	//original value in 10mA increments
-		break;
-	case POWER_SUPPLY_PROP_CAPACITY:
-		val->intval = percent_val;
-		break;
-	case POWER_SUPPLY_PROP_MODEL_NAME:
-		val->strval = EXPI_MANUFACTURER;
-		break;
-	default:
-		return -EINVAL;
-	}
-	return 0;
-}
-
 void gpio_func(int pin, int state)
 {
 	volatile unsigned *tgpio = gpio;
@@ -243,9 +174,6 @@
 	int byteindex;
 	long bitindex;
 
-	if(running)
-		mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME);
-
 	gpio_func(gc_gpio_data,1);	//input
 
 	for(byteindex=0;byteindex<GC_LENGTH;byteindex++){
@@ -270,14 +198,36 @@
 	udelay(BITRATE);
 
 	if(data[0] && !check_crc16(data)){
-		version_val = ((data[0]&0xC0)<<2) | (data[0]&0x3F);
-
-		data[GC_LENGTH+0] = 0xC0 | (index&0x3);
-		data[GC_LENGTH+1] = values.data[index&0x3];
-		calc_crc16(&data[GC_LENGTH],2);
-		index++;
+		uint8_t len = 0;
+		if(data[0]==0xA5){
+			unsigned char val;
+			len = 2;
+			version_val = 0x0100;
+			val = values.fan_val | (values.flags_val&0x1 ? 0x00 : 0x80);
+			data[GC_LENGTH] = val;
+			data[GC_LENGTH+1] = ~val;
+			data[GC_LENGTH+2] = 0;
+			data[GC_LENGTH+3] = 0;
+		}
+		else
+		if(data[0]==0x5A){
+			len = 4;
+			version_val = 0x0101;
+			data[GC_LENGTH+0] = 0xC0 | (index&0x3);
+			data[GC_LENGTH+1] = values.data[index&0x3];
+			calc_crc16(&data[GC_LENGTH],2);
+			index++;
+		}
+		else{
+			len = 4;
+			version_val = ((data[0]&0xC0)<<2) | (data[0]&0x3F);
+			data[GC_LENGTH+0] = 0xC0 | (index&0x3);
+			data[GC_LENGTH+1] = values.data[index&0x3];
+			calc_crc16(&data[GC_LENGTH],2);
+			index++;
+		}
 
-		for(byteindex=GC_LENGTH;byteindex<GC_LENGTH+4;byteindex++){
+		for(byteindex=GC_LENGTH;byteindex<GC_LENGTH+len;byteindex++){
 			for(bitindex=0;bitindex<8;bitindex++){
 				if(data[byteindex]&(0x80>>bitindex))
 					GPIO_SET |= gc_data_bit;
@@ -295,33 +245,30 @@
 
 		input_report_abs(dev, ABS_X, (int16_t)data[1]);		//X Axis
 		input_report_abs(dev, ABS_Y, (int16_t)data[2]);		//Y Axis
-		input_report_abs(dev, ABS_RX, (int16_t)data[3]);	//RX Axis
-		input_report_abs(dev, ABS_RY, (int16_t)data[4]);	//RY Axis
 
-		input_report_key(dev, gc_btn[0], !(data[5]&0x01));	//DPAD Up
-		input_report_key(dev, gc_btn[1], !(data[5]&0x02));	//DPAD Down
-		input_report_key(dev, gc_btn[2], !(data[5]&0x04));	//DPAD Left
-		input_report_key(dev, gc_btn[3], !(data[5]&0x08));	//DPAD Right
-		input_report_key(dev, gc_btn[4], !(data[5]&0x10));	//A
-		input_report_key(dev, gc_btn[5], !(data[5]&0x20));	//B
-		input_report_key(dev, gc_btn[6], !(data[5]&0x40));	//X
-		input_report_key(dev, gc_btn[7], !(data[5]&0x80)); 	//Y
-		input_report_key(dev, gc_btn[8], !(data[6]&0x01));	//Left Button
-		input_report_key(dev, gc_btn[9], !(data[6]&0x02));	//Right Button
-		input_report_key(dev, gc_btn[10], !(data[6]&0x04));	//Left Trigger
-		input_report_key(dev, gc_btn[11], !(data[6]&0x08));	//Right Trigger
-		input_report_key(dev, gc_btn[12], !(data[6]&0x10));	//Left Thumb
-		input_report_key(dev, gc_btn[13], !(data[6]&0x20));	//Right Thumb
-		input_report_key(dev, gc_btn[14], !(data[6]&0x40));	//Select
-		input_report_key(dev, gc_btn[15], !(data[6]&0x80));	//Start
+		input_report_key(dev, gc_btn[0], !(data[3]&0x01));	//A
+		input_report_key(dev, gc_btn[1], !(data[3]&0x02));	//B
+		input_report_key(dev, gc_btn[2], !(data[3]&0x04));	//C
+		input_report_key(dev, gc_btn[3], !(data[3]&0x08));	//X
+		input_report_key(dev, gc_btn[4], !(data[3]&0x10));	//Y
+		input_report_key(dev, gc_btn[5], !(data[3]&0x20));	//Z
+		input_report_key(dev, gc_btn[6], data[3]&0x40);		//Select
+		input_report_key(dev, gc_btn[7], data[3]&0x80); 	//Start
+		input_report_key(dev, gc_btn[8], data[4]&0x40);		//Left Thumb
+		input_report_key(dev, gc_btn[9], data[4]&0x01);		//DPAD Up
+		input_report_key(dev, gc_btn[10], data[4]&0x02);	//DPAD Down
+		input_report_key(dev, gc_btn[11], data[4]&0x04);	//DPAD Left
+		input_report_key(dev, gc_btn[12], data[4]&0x08);	//DPAD Right
+		input_report_key(dev, gc_btn[13], data[4]&0x10);	//Left Shoulder
+		input_report_key(dev, gc_btn[14], data[4]&0x20);	//Right Shoulder
 
 		input_sync(dev);
 
-		stat_val = data[7];					//VBus,Shutdown
-		vol_val = data[8];					//Volume
-		batt_val = (int)(data[9]*5)+2950;			//Battery Voltage
-		cur_val = (int)((signed char)data[10])*50;		//Current
-		percent_val = data[11];					//battery percentage
+		batt_val = (int)(data[7]*5)+2950;		//Battery Voltage
+		cur_val = (int)((signed char)data[8])*50;	//Current
+		percent_val = data[9];				//battery percentage
+		stat_val = data[5]&0xC6;			//VBus,Shutdown,VSTAT2,VSTAT1
+		vol_val = data[6];				//Volume
 
 		lasterror = 0;
 	}
@@ -338,9 +285,12 @@
 	}
 
 	gpio_func(gc_gpio_data,1);	//input
+
+	if(running)
+		mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME);
 }
 
-static int gc_setup_pad(struct gc *gc)
+static int __init gc_setup_pad(struct gc *gc)
 {
 	struct input_dev *input_dev;
 	int i;
@@ -352,7 +302,7 @@
 		return -ENOMEM;
 	}
 
-	input_dev->name = "Experimental Pi Controller";
+	input_dev->name = "PiBoy DMG Controller";
 	input_dev->phys = "input0";
 	input_dev->id.bustype = BUS_PARPORT;
 	input_dev->id.vendor = 0x0001;
@@ -363,15 +313,13 @@
 
 	input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
 
-	input_set_abs_params(input_dev, ABS_X, 0, 255, 0, 0);
-	input_set_abs_params(input_dev, ABS_Y, 0, 255, 0, 0);
-	input_set_abs_params(input_dev, ABS_RX, 0, 255, 0, 0);
-	input_set_abs_params(input_dev, ABS_RY, 0, 255, 0, 0);
-
 	for (i = 0; i < gc_btn_size; i++){
 		__set_bit(gc_btn[i], input_dev->keybit);
 	}
 
+	input_set_abs_params(input_dev, ABS_X, 0, 255, 0, 0);
+	input_set_abs_params(input_dev, ABS_Y, 0, 255, 0, 0);
+
 	err = input_register_device(input_dev);
 	if (err)
 		goto err_free_dev;
@@ -380,8 +328,8 @@
 	gpio_func(gc_gpio_clk,0);	//output
 	gpio_func(gc_gpio_data,1);	//input
 
-	printk(KERN_INFO "GPIO%i and GPIO%i configured for Experimental Pi controller pins\n",gc_gpio_clk,gc_gpio_data);
-	printk(KERN_INFO "Experimental Pi Controls module loaded");
+	printk(KERN_INFO "GPIO%i and GPIO%i configured for Piboy DMG controller pins\n",gc_gpio_clk,gc_gpio_data);
+	printk(KERN_INFO "PiBoy DMG Controls module loaded");
 
 	return 0;
 
@@ -391,7 +339,7 @@
 	return err;
 }
 
-static struct gc *gc_probe(void)
+static struct gc __init *gc_probe(void)
 {
 	struct gc *gc;
 	int err;
@@ -481,7 +429,7 @@
 	printk(KERN_INFO "Executing OSD: %i",result);
 }
 
-static int gc_init(void)
+static int __init gc_init(void)
 {
 	/* BCM board peripherals address base */
 	static u32 gc_bcm2708_peri_base;
@@ -509,10 +457,8 @@
    	}
 
 	gc_base = gc_probe();
-	if (IS_ERR(gc_base)){
-		printk(KERN_INFO "failed to probe controls\n");
+	if (IS_ERR(gc_base))
 		return -ENODEV;
-	}
 
 	/*Creating a directory in /sys/kernel/ */
 	kobj_ref = kobject_create_and_add("xpi_gamecon",kernel_kobj);
@@ -558,8 +504,10 @@
 		goto r_sysfs;
 	}
 
-	running = 1;
+	printk(KERN_INFO "Device Driver Insert...Done!!!\n");
 
+	running = 1;
+	
 	mod_timer(&gc_base->timer, jiffies + GC_REFRESH_TIME);
 
 	return 0;
@@ -585,7 +533,7 @@
         return -1;
 }
 
-static void gc_exit(void)
+static void __exit gc_exit(void)
 {
 	running = 0;
 
@@ -608,75 +556,9 @@
 	sysfs_remove_file(kernel_kobj, &red.attr);
 	sysfs_remove_file(kernel_kobj, &flags.attr);
 	sysfs_remove_file(kernel_kobj, &version.attr);
-}
-
-static int expi_probe(struct platform_device *pdev)
-{
-	struct expi *adc_bat;
-	struct power_supply_desc *psy_desc;
-	struct power_supply_config psy_cfg = {};
-
-	int ret = gc_init();
-	if(ret){
-		printk(KERN_INFO "failed to init controls\n");
-		return ret;
-	}
-
-	adc_bat = devm_kzalloc(&pdev->dev, sizeof(*adc_bat), GFP_KERNEL);
-	if (!adc_bat) {
-		dev_err(&pdev->dev, "failed to allocate memory\n");
-		return -ENOMEM;
-	}
-
-	psy_cfg.drv_data = adc_bat;
-	psy_desc = &adc_bat->psy_desc;
-	psy_desc->name = EXPI_DRIVER_NAME;
-
-	/* bootup default values for the battery */
-	adc_bat->cable_plugged = false;
-	adc_bat->status = POWER_SUPPLY_STATUS_DISCHARGING;
-	psy_desc->type = POWER_SUPPLY_TYPE_BATTERY;
-	psy_desc->get_property = expi_get_property;
-
-	adc_bat->psy = power_supply_register(&pdev->dev, psy_desc, &psy_cfg);
-	if (IS_ERR(adc_bat->psy)) {
-		printk(KERN_INFO "failed to register battery\n");
-		goto err_reg_fail;
-	}
-
-	platform_set_drvdata(pdev, adc_bat);
-
-	printk(KERN_INFO "Experimental Pi Driver Insert...Done!!!\n");
 
-	return 0;
-
-err_reg_fail:
-	return PTR_ERR(adc_bat->psy);
-}
-
-static int expi_remove(struct platform_device *pdev)
-{
-	struct expi *adc_bat = platform_get_drvdata(pdev);
-
-	gc_exit();
-
-	power_supply_unregister(adc_bat->psy);
-
-	printk(KERN_INFO "Experimental Pi Driver unloaded");
-
-	return 0;
+	printk(KERN_INFO "PiBoy DMG Controls module unloaded");
 }
 
-static struct platform_driver expi_driver = {
-	.driver		= {
-		.name	= EXPI_DRIVER_NAME,
-	},
-	.probe		= expi_probe,
-	.remove		= expi_remove,
-};
-
-//module_platform_driver(expi_driver);
-
 module_init(gc_init);
 module_exit(gc_exit);
-
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment