[e3-hacking] Modem Patch

Matt Callow mc-spam at tesco.net
Tue Mar 7 19:33:38 GMT 2006


Hi,

attached is a patch to enable the modem on the e3.  The patch should be
applied after Jonathans patches.
It is then accessable as /dev/ttyS1. I use micrcom to talk to it.
So far, I've managed to get it connected to the phone line as a speaker
phone, but I can't get any sound through the handset.

Matt



-------------- next part --------------
Index: linux-2.6/include/asm-arm/arch-omap/serial.h
===================================================================
--- linux-2.6/include/asm-arm/arch-omap/serial.h	(revision 370)
+++ linux-2.6/include/asm-arm/arch-omap/serial.h	(working copy)
@@ -34,4 +34,9 @@
 			__ret;					\
 			})
 
+#if defined(CONFIG_MACH_AMS_DELTA)
+#define AMS_DELTA_MODEM_CLK 1843200
+#define AMS_DELTA_MODEM_LINE 1
 #endif
+
+#endif
Index: linux-2.6/arch/arm/mach-omap1/board-ams-delta.c
===================================================================
--- linux-2.6/arch/arm/mach-omap1/board-ams-delta.c	(revision 379)
+++ linux-2.6/arch/arm/mach-omap1/board-ams-delta.c	(working copy)
@@ -15,7 +15,11 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
+#include <linux/serial.h>
+#include <linux/serial_core.h>
+#include <asm/arch/gpio.h>
 
+
 #include <asm/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -31,6 +35,23 @@
 static u8 ams_delta_latch1_reg;
 static u16 ams_delta_latch2_reg;
 
+static struct uart_port delta_serial_ports[] = {
+        {
+		.membase	= (char*)AMS_DELTA_MODEM_VIRT, // remapped locn
+                .mapbase        = AMS_DELTA_MODEM_PHYS,
+                .irq            = OMAP_GPIO_IRQ(2),
+                .flags          = UPF_SKIP_TEST | 
+					UPF_BOOT_AUTOCONF | 
+					UPF_BUGGY_UART,	/* not sure if the UART really is buggy, */
+							/* but without this LSR safety check is engaged on 2nd open */
+                .iotype         = UPIO_MEM,
+                .regshift       = 1, 
+                .uartclk        = AMS_DELTA_MODEM_CLK,
+                .line           = AMS_DELTA_MODEM_LINE,
+                .type           = PORT_16550A
+        }
+};
+
 void ams_delta_latch1_write(u8 mask, u8 value)
 {
 	ams_delta_latch1_reg &= ~mask;
@@ -50,6 +71,8 @@
 	omap1_init_common_hw();
 	omap_init_irq();
 	omap_gpio_init();
+	// set IRQ triggering for modem
+	set_irq_type(OMAP_GPIO_IRQ(2),IRQT_RISING);
 }
 
 static struct map_desc ams_delta_io_desc[] __initdata = {
@@ -98,6 +121,45 @@
 	{ OMAP_TAG_USB,		&ams_delta_usb_config },
 };
 
+
+/*---------------------------------------------------------------------------
+** Purpose:
+**
+** Returns: Nothing.
+**
+*/
+void AMS_DELTA_MDM_Enable(__u8 state)
+{
+        if(state)
+	{
+                //Enable modem
+                printk("modem enable %lu\n\r", jiffies);
+                ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_NRESET,
+                                         AMS_DELTA_LATCH2_MODEM_NRESET);
+                ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC,
+                                                   AMS_DELTA_LATCH2_MODEM_CODEC);
+                }
+        else
+                {
+                //Disable Modem
+                printk("modem disable %lu\n\r", jiffies);
+                ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_NRESET, 0);
+                ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC, 0);
+	}
+}
+
+static void __ams_delta_modem_init(void)
+{
+
+	printk("ams_delta_modem_init\n\r");
+
+	AMS_DELTA_MDM_Enable(1);
+	
+        if (early_serial_setup(&delta_serial_ports[0]) != 0) {
+                panic("Could not register ttyS1/Amstrad Modem!");
+        }
+}
+
 static void __init ams_delta_init(void)
 {
 	iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc));
@@ -108,11 +170,13 @@
 
 	/* Clear latch2 (NAND, LCD, modem enable) */
 	ams_delta_latch2_write(~0, 0);
+	__ams_delta_modem_init();
 }
-
 static void __init ams_delta_map_io(void)
 {
 	omap1_map_common_io();
+	printk("ams_delta_map_io\n\r");
+
 }
 
 MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")
@@ -129,3 +193,5 @@
 
 EXPORT_SYMBOL(ams_delta_latch1_write);
 EXPORT_SYMBOL(ams_delta_latch2_write);
+EXPORT_SYMBOL(AMS_DELTA_MDM_Enable);
+
Index: linux-2.6/drivers/serial/8250.c
===================================================================
--- linux-2.6/drivers/serial/8250.c	(revision 374)
+++ linux-2.6/drivers/serial/8250.c	(working copy)
@@ -1529,7 +1529,16 @@
 		serial_outp(up, UART_EFR, UART_EFR_ECB);
 		serial_outp(up, UART_LCR, 0);
 	}
+	
+#ifdef CONFIG_MACH_AMS_DELTA
+        if (up->port.line == AMS_DELTA_MODEM_LINE)
+        {
+                extern void AMS_DELTA_MDM_Enable(__u8 state);
+                AMS_DELTA_MDM_Enable(1);
+        }
+#endif
 
+
 #ifdef CONFIG_SERIAL_8250_RSA
 	/*
 	 * If this is an RSA port, see if we can kick it up to the
@@ -1694,6 +1703,15 @@
 	serial_out(up, UART_LCR, serial_inp(up, UART_LCR) & ~UART_LCR_SBC);
 	serial8250_clear_fifos(up);
 
+#if defined(CONFIG_MACH_AMS_DELTA)
+        if (port->line == AMS_DELTA_MODEM_LINE)
+        {
+                extern void AMS_DELTA_MDM_Enable(__u8 state);
+                AMS_DELTA_MDM_Enable(0);                                    // disable modem
+        }
+#endif
+
+
 #ifdef CONFIG_SERIAL_8250_RSA
 	/*
 	 * Reset the RSA board back to 115kbps compat mode.



More information about the e3-hacking mailing list